- 1、本文档共74页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
4.第四讲常用开发工具
北京理工大学珠海学院 计算机教研室 第十二章 常用开发工具 教学目的 通过本节内容的学习掌握Linux下的程序编译系统gcc的使用;初步能利用gdb调试器对程序进行简单调试;理解并掌握程序维护工具make的作用及使用,能够编写简单的makefile,来对程序进行管理。 本讲内容知识点 gcc编译系统(重点、难点) gdb程序调试工具 程序维护工具make(重点、难点) 教学重点 gcc编译系统的使用 程序维护工具make的规则 教学难点 gcc编译系统参数的灵活运用 理解Makefile的编写规则 3.10 GCC编译系统 3.10.1 文件名后缀 3.10.2 C语言编译过程 1.预处理阶段(Pre-Processing) 预处理是常规编译 之前预先进行的工作, 故此得名。它读取C语言 源文件,对其中以“#” 开头的指令(伪指令) 和特殊符号进行处理。 主要包括文件包含、宏 定义和条件编译指令。 使用gcc编译代码 源代码 gcc指令的一般格式为: gcc [选项] 要编译的文件 [选项] [目标文件] 其中,目标文件可缺省,gcc默认生成可执行的文件,名为:编译文件.out 实例: gcc –E hello.c –o hello.i -E的作用是让gcc在预处理结束后停止编译过程 查看hello.i,验证gcc确实进行了预处理,把”stdio.h”的内容插入到hello.i文件中 2.编译阶段(Compiling) 编译程序(Compiler)对预处理之后的输出文件进行词法分析和语法分析,试图找出所有不符合语法规则的部分 gcc把代码翻译成汇编语言 实例: Gcc –S hello.i –o hello.s -S的作用是只进行编译而不进行汇编 查看hello.s,验证gcc确实进行了编译。生成了汇编代码 3.汇编过程(Assembling) 汇编过程是汇编程序(Assembler)把汇编语言代码翻译成目标机器代码的过程 实例: gcc –c hello.s –o hello.o -c的作用将汇编代码转化为目标代码 4.链接阶段(Linking)—函数库 系统把这些函数实现都被做到名为libc.so.6的库文件中。 若没有特别的指定时,gcc会到系统默认的搜索路径”/usr/lib”下进行查找,即链接到libc.so.6库函数中,从而实现函数”printf” 函数库一般分为静态库和动态库两种 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,故生成的文件比较大,但在运行时不再需要库文件。后缀一般为”.a” 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时连接文件加载库,这样节省系统的开销。动态库一般后缀为”.so” gcc在编译时默认使用动态库 实例:gcc hello.o –o hello 生成可执行文件 命令: $gcc hello.c –o hello 运行程序 $./hellohello gcc! 3.10.3 gcc命令行选项 在Linux系统中,C/C++程序编译命令是gcc,例如: $ gcc f1.c f2.c (针对C语言源程序) 执行完成后,生成默认的可执行文件a.out。 1.预处理选项 C语言预处理程序通常称为cpp,它是宏处理程序,由C编译程序自动调用,在真正的编译过程之前对程序进行转换。 ●几个预处理常用选项 “-O2”除了完成所有”-O1”级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度 “-O3”则还包括循环展开和其他一些与处理器特性相关的优化工作 虽然优化选项可以加速代码的运行速度,但对于调试而言将是一个很大的挑战 原先源程序中声明和使用的变量很可能不再使用,控制流可能会突然跳转到意外的地方,循环语句也可能因为循环展开而变得到处都有 建议在调试的时候最好不使用任何优化选项,发行的时候才考虑 优化程序常用的选项及其作用 Linux下库文件的命名有一个约定,所有的库名都以lib开头。形如: libx.a 其中,x是指定的库名 以.a(归档,archive)结尾的库是静态库,以.so(共享目标,shared object)结尾的库是动态库 生成静态库的方法实际上可分为两步: ① 将各函数的源文件编译成目标文件 ② 使用ar工具将目标文件收集起来,放到一个归档文件中 编译多个文件 文件清单 目录结构(1) 编译命令 $ gcc my_app.c greeting.c –o my_app 目录结构(2) 编译方式
文档评论(0)