欢迎来到天天文库
浏览记录
ID:10018912
大小:1.63 MB
页数:60页
时间:2018-05-12
《第6讲 linux编程基础》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux编程基础Linux下的程序设计主要指C程序设计,它与其他环境中的C程序设计一样,主要涉及到编辑器、编译链接器、调试器及项目管理工具。GCC编译器GCC编译器能将C、C++语言源程序、汇编程序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,GCC将生成一个名为*.out的文件。在Linux系统中,编译器通过程序的扩展名可分辨出编写原始程序代码所用的语言,由于不同程序所需要执行编译的步骤是不同的。因此GCC可根据不同的扩展名对它们进行分别处理,扩展名文件类型后续编译流程.cC语言源代码文件预处理、编译、汇编、链接.C/.cc/.cxxC++源代码文件预处理、
2、编译、汇编、链接.mObjective-C源代码文件预处理、编译、汇编、链接.i已经预处理过的C源代码文件编译、汇编、链接.ii已经预处理过的C++源代码文件编译、.s汇编语言源代码文件汇编、链接.S经过预编译的汇编语言源代码文件汇编、链接.a由目标文件构成的档案库文件链接.o编译后的目标文件链接.h程序所包含的头文件GCC所支持的扩展名文件GCC编译过程在使用GCC编译程序时,整个编译过程可以被细分为四个阶段。预处理(Pre-Processing)编译(Compiling)汇编(Assembling)链接(Linking)基本语法格式gcc[选项]准备编译的文件[选项][目标文
3、件]下面以一个具体的C程序实例来分析这四个阶段。文件名为hello.c,程序清单如下:#includeintmain(){printf("Hello,mydearfriend!");return(0);}GCC编译实例预处理阶段执行命令[root@vm-devmyprg]#gcc-Ehello.c-ohello.i“-E”指定只进行预处理,“hello.c”是源程序文件,“-o”指定生成目标文件,“hello.i”是预处理过程生成的目标文件。预处理阶段对预处理文件hello.i进行编译。[root@vm-devmyprg]#gcc-Shello.i-ohel
4、lo.S“-S”指定只进行到编译阶段,“hello.i”是进行编译的源文件,“-o”指定生成目标文件,“hello.S”是编译生成的目标文件名。编译阶段编译阶段[root@vm-devmyprg]#gcc-chello.S-ohello.o“-c”指定只进行到汇编阶段结束为止,“hello.S”是进行汇编的源文件,“-o”指定生成目标文件,“hello.o”是编译生成的目标文件名。hello.o为二进制目标代码文件。汇编阶段在成功编译之后,就进入了链接阶段。在这里涉及到一个重要的概念:函数库。在这个程序中并没有定义“printf”的函数实现,且在预编译中包含进的“stdio.h”
5、中也只有该函数的声明,而没有定义函数的实现,系统把这些函数实现都被做到名为libc.so.6的库文件中去了,在没有特别指定时,Gcc会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到libc.so.6库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。链接阶段函数库一般分为静态库和动态库两种。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时运行链接文件加载库,这样可以节省系统
6、的开销。动态库一般后缀名为“.so”,如前面所述的libc.so.6就是动态库。GCC在编译时默认使用动态库。函数库完成了链接之后,GCC就可生成可执行文件:[root@vm-devmyprg]#gcchello.o-ohello该命令gcc之后无选项参数,表示对指定的源文件进行编译,直到输出执行文件(示例中的源文件为hello.o,输出的执行文件hello)。运行该可执行文件[root@vm-devmyprg]#./hello链接阶段[root@vm-devmyprg]#gccfoo1.cfoo2.c-ofoo对于源文件不止一个情况,GCC编译过程仍然按照预处理、编译、汇编和链
7、接的过程依次进行。因此,上面这条命令相当于依次执行如下三条命令。[root@vm-devmyprg]#gcc-cfoo1.c-ofoo1.o[root@vm-devmyprg]#gcc-cfoo2.c-ofoo2.o[root@vm-devmyprg]#gccfoo1.ofoo2.o-ofoo同时编译多个文件GCC编译选项介绍选项作用-E只进行预编译,不做其他处理;-o指定编译的输出文件;-S只编译到汇编阶段,生成汇编代码;-c只编译到链接阶段,生成目标文件“.o”;-g在可执行
此文档下载收益归作者所有