第四章GCC程序开发工具(二).pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第四章GCC程序开发工具(二)第四章GCC程序开发工具(二)

第四章 GCC程序开发工具 GCC工具的组成 使用GCC编译-连接程序,生成可执行文件、静态库、动态库 二进制工具的基本使用方法 4.1 GNU工具综述 在Linux中,GNU Tools 是跨平台编译器的集合; GCC 对默认文件的处理包含了文本文件和二进制文件两种:文本文件(*.c,*.h,*.s) 二进制文件 *.o ;*.so;*.a 回忆一下实验中*.o 代表什么文件? GCC 生成可执行程序的步骤: 分成四步: 预处理:生成.i 文件(预处理器cpp)。 编译:将预处理后文件转换成汇编语言,即生成.s文件(编译器gcc); 汇编:由汇编代码生成目标代码,即机器代码,生成.o 文件(汇编器as); 连接:由各个文件的目标代码,生成可执行程序(链接器ld) GCC 重要的参数选项 -E 预处理 -S 编译 -c汇编 见P41 P42 GCC的编译和连接 工程示例 包含5个文件: getarg.h:头文件 getarg.c:源文件 writeinfo.h:头文件 writeinfo.c:源文件 main.c:源文件,包含main 主函数 生成可执行程序 $ gcc getarg.c writeinfo.c main.c 这个过程在一步中完成编译、汇编和连接。 注: 使用-o 可以指定输出的文件名称,如果不指定,将使用默认的文件名a.out 补充:main 函数的两个参数 main 参数 C语言中的main函数,一般会带有两个参数int main(int argc,char *argv[]),这是一个典型的main 函数的声明。这是为了在执行程序时需要向程序传递参数,参数argc代表了输入参数的个数,char *argv[] 表示传入的参数的字符串,是一个字符串指针数组。 条件编译 #ifndef __GETARG_H__ #define __GETARG_H__ #endif 编译、汇编、连接 从C语言到最终的可执行程序,主要分成两个阶段: 将各个C语言的源文件生成目标文件(*.o); 将各个目标文件进行连接生成可执行程序。 第一步:生成目标文件 $gcc –pipe –g –Wall –I. –c -o getarg.o getarg.c $gcc –pipe –g –Wall –I. –c –o writeinfo.o writeinfo.c $gcc –pipe –g –Wall –I. –c –o main.o main.c 第二步:连接三个目标文件,生成可执行文件 $gcc –Wall –g getarg.o writeinfo.o main.o –o test 另一种连接方法:静态连接 静态连接,即使用GCC生成静态连接的可执行程序。 $gcc –Wall –g getarg.o writeinfo.o main.o –static –o test_static 说明:生成静态连接的程序的区别在于需要增加-static 选项。相比动态连接的程序,test_static 将程序中使用到的库函数都纳入文件之中,既包含所有使用的库函数。这时生成的程序要比使用动态连接方式生成的程序大得多,但是在运行过程中不需要再加载这些库。 补充:库文件 库是一组预先编译好的函数的集合,这些函数都是按照可重用的原则编写的。它们通常由一组相互关联的函数组成并执行某项常见的任务。 例如:数学库 标准系统库文件一般存储在/lib 和 /usr/lib 目录中。C语言编译器(实际上时连接程序)需要知道要搜索哪些库文件,默认情况下,它只搜索标准C语言库。 库文件遵循的规范 需要在命令行中明确指定 .a 代表传统的静态函数库。 .so代表共享函数库。 函数库通常以静态库和共享库两种格式存在($ ls /usr/lib 查看)。 库函数的使用 通过完整的路径名或用-l标志指示编译器要搜索的库文件。 $gcc example.c -o example /usr/lib/libm.a 这条命令指示编译器编译文件example.c,将编译产生的程序文件命名为example,并且除搜索标准的函数库外,还搜索数学库已解决函数引用问题。 或: $gcc –o example example -lm (P26) 注:-lm (字母l与m 之间没有空格) 虽然库文件和头文件一样,通常都保存在标准位置,但我们也可以通过 –L 选项为编译器增加库的搜索路径。 静态库(也称为归档文件 .a ) 函数库最简单的形式是一组处于“准备好使用”状态的目标文件。当程序需要使用函数库中的某个函数时,它包含一个声明该函数的头文件。编译器和链接器负责将程序代码和函数库结合在一起组成一个单独的可执行文件。 可以容易地创建和维护

文档评论(0)

skewguj + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档