欢迎来到天天文库
浏览记录
ID:57026735
大小:43.50 KB
页数:30页
时间:2020-07-26
《程序开发工具(二)课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第四章GCC程序开发工具GCC工具的组成使用GCC编译-连接程序,生成可执行文件、静态库、动态库二进制工具的基本使用方法4.1GNU工具综述在Linux中,GNUTools是跨平台编译器的集合;GCC对默认文件的处理包含了文本文件和二进制文件两种:文本文件(*.c,*.h,*.s)二进制文件*.o;*.so;*.a回忆一下实验中*.o代表什么文件?GCC生成可执行程序的步骤:分成四步:预处理:生成.i文件(预处理器cpp)。编译:将预处理后文件转换成汇编语言,即生成.s文件(编译器gcc);汇编:由汇编代码生成目标代码,即机器代码,生成.o文件(汇编器as);连接:由各个文件的目标
2、代码,生成可执行程序(链接器ld)GCC重要的参数选项-E预处理-S编译-c汇编见P41P42GCC的编译和连接工程示例包含5个文件:getarg.h:头文件getarg.c:源文件writeinfo.h:头文件writeinfo.c:源文件main.c:源文件,包含main主函数生成可执行程序$gccgetarg.cwriteinfo.cmain.c这个过程在一步中完成编译、汇编和连接。注:使用-o可以指定输出的文件名称,如果不指定,将使用默认的文件名a.out补充:main函数的两个参数main参数C语言中的main函数,一般会带有两个参数intmain(intargc,cha
3、r*argv[]),这是一个典型的main函数的声明。这是为了在执行程序时需要向程序传递参数,参数argc代表了输入参数的个数,char*argv[]表示传入的参数的字符串,是一个字符串指针数组。条件编译#ifndef__GETARG_H__#define__GETARG_H__#endif编译、汇编、连接从C语言到最终的可执行程序,主要分成两个阶段:将各个C语言的源文件生成目标文件(*.o);将各个目标文件进行连接生成可执行程序。第一步:生成目标文件$gcc–pipe–g–Wall–I.–c-ogetarg.ogetarg.c$gcc–pipe–g–Wall–I.–c–owrit
4、einfo.owriteinfo.c$gcc–pipe–g–Wall–I.–c–omain.omain.c第二步:连接三个目标文件,生成可执行文件$gcc–Wall–ggetarg.owriteinfo.omain.o–otest另一种连接方法:静态连接静态连接,即使用GCC生成静态连接的可执行程序。$gcc–Wall–ggetarg.owriteinfo.omain.o–static–otest_static说明:生成静态连接的程序的区别在于需要增加-static选项。相比动态连接的程序,test_static将程序中使用到的库函数都纳入文件之中,既包含所有使用的库函数。这时生成
5、的程序要比使用动态连接方式生成的程序大得多,但是在运行过程中不需要再加载这些库。补充:库文件库是一组预先编译好的函数的集合,这些函数都是按照可重用的原则编写的。它们通常由一组相互关联的函数组成并执行某项常见的任务。例如:数学库标准系统库文件一般存储在/lib和/usr/lib目录中。C语言编译器(实际上时连接程序)需要知道要搜索哪些库文件,默认情况下,它只搜索标准C语言库。库文件遵循的规范需要在命令行中明确指定.a代表传统的静态函数库。.so代表共享函数库。函数库通常以静态库和共享库两种格式存在($ls/usr/lib查看)。库函数的使用通过完整的路径名或用-l标志指示编译器要搜索
6、的库文件。$gccexample.c-oexample/usr/lib/libm.a这条命令指示编译器编译文件example.c,将编译产生的程序文件命名为example,并且除搜索标准的函数库外,还搜索数学库已解决函数引用问题。或:$gcc–oexampleexample-lm(P26)注:-lm(字母l与m之间没有空格)虽然库文件和头文件一样,通常都保存在标准位置,但我们也可以通过–L选项为编译器增加库的搜索路径。静态库(也称为归档文件.a)函数库最简单的形式是一组处于“准备好使用”状态的目标文件。当程序需要使用函数库中的某个函数时,它包含一个声明该函数的头文件。编译器和链接器
7、负责将程序代码和函数库结合在一起组成一个单独的可执行文件。可以容易地创建和维护自己的静态库,只要使用ar(代表archive,即建立归档文件)程序和gcc–c命令对函数分别进行编译。静态库示例foo.cfun.cmain.c$gcc-cfoo.cfun.c$ls*.o创建一个库文件$arcrvlibmy.afoo.ofun.o运行包含自己的库程序$gcc–omainmain.o–L.-lmyfun共享库(动态库)静态库的一个缺点是,当我们同时运行许多应用程序并且它们都
此文档下载收益归作者所有