2022年gcc入门教程 .pdf
《2022年gcc入门教程 .pdf》由会员分享,可在线阅读,更多相关《2022年gcc入门教程 .pdf(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、不经意间,GCC 已发展到了4.3 的版本,尽管在软件开发社区之外乏人闻问,但因为GCC在几乎所有开源软件和自由软件中都会用到,因此它的编译性能的涨落会直接影响到Linux、Firefox 乃至于 OpenOffice.org 和 Apache 等几千个项目的开发。因此,把GCC 摆在开源软件的核心地位是一点也不为过。另一方面,GCC4.3 的 出现,正在牵引着广大程序员们的心。如果我们非要用一个词来说明GCC 与程序员之间的关系,那无疑是 心随心动。历史篇作为自由软件的旗舰项目,Richard Stallman 在十多年前刚开始写作GCC 的时候,还只是把它当作仅仅一个C 程序语言的编译器;
2、GCC 的意思也只是GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持C 语言;它现在还支持Ada 语言、C+语言、Java 语言、Objective C 语言、Pascal 语言、COBOL 语言,以及支持函数式编程和逻辑编程的Mercury 语言,等等。而GCC 也不再单只是GNU C 语言编译器的意思了,而是变成了GNU Compiler Collection 也即是GNU 编译器家族的意思了。另一方面,说到GCC 对于各种硬件平台的支持,概括起来就是一句话:无所不在。几乎所有有点实际用途的硬件平台,甚至包括有些不那么有实际用途的硬件平台。Gcc 简介Li
3、nux 系统下的gcc(GNU C Compiler)是 GNU 推出的功能强大、性能优越的多平台编译器,是 GNU 的代表作品之一。Gcc 是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%30%。官方网站:http:/gcc.gnu.org/gcc 是 linux 的唯一编译器,没有 gcc 就没有 linux,gcc 的重要性就不可言喻啦。居然这么重要,那就很值得我们来好好研究下啦。好啦,开始我们的gcc 之旅吧!首先消除gcc 和 g+误区吧。gcc 和 g+都是 GNU(组织)的一个编译器。误区一:gcc只能编译c代码,g+只能编译c+
4、代码两者都可以,但是请注意:1.后缀为.c 的,gcc 把它当作是C 程序,而g+当作是 c+程序;后缀为.cpp 的,两者都会认为是 c+程序,注意,虽然c+是 c 的超集,但是两者对语法的要求是有区别的,例如:#include int main(int argc,char*argv)if(argv=0)return;printString(argv);return;int printString(char*string)sprintf(string,This is a test.n);如果按照C 的语法规则,OK,没问题,但是,一旦把后缀改为cpp,立刻报三个错:“printString未
5、定义”;“cannot convert char*to char*”;名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 14 页 -”return-statement with no value“;分别对应前面红色标注的部分。可见C+的语法规则更加严谨一些。2.编译阶段,g+会调用 gcc,对于 c+代码,两者是等价的,但是因为gcc 命令不能自动和C程序使用的库联接,所以通常用g+来完成链接,为了统一起见,干脆编译/链接统统用 g+了,这就给人一种错觉,好像cpp 程序只能用g+似的。误区二:gcc不会定义 _cplusplus宏,而 g+会实际上,这个宏只是标志着编译器将会把代
6、码按C 还是 C+语法来解释,如上所述,如果后缀为.c,并且采用gcc 编译器,则该宏就是未定义的,否则,就是已定义。误区三:编译只能用gcc,链接只能用g+严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g+,而链接可以用g+或者 gcc-lstdc+。因为 gcc 命令不能自动和C程序使用的库联接,所以通常使用 g+来完成联接。但在编译阶段,g+会自动调用gcc,二者等价。误区四:extern C 与 gcc/g+有关系实际上并无关系,无论是gcc 还是 g+,用 extern c 时,都是以C 的命名方式来为symbol命名,否则,都以c+方式命名。试验如下:m
7、e.h:extern C void CppPrintf(void);me.cpp:#include#include me.h using namespace std;void CppPrintf(void)cout Hellon;test.cpp:#include#include#include me.h int main(void)CppPrintf();return 0;1.先给 me.h 加上 extern C,看用 gcc 和 g+命名有什么不同名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 14 页 -rootroot G+#g+-S me.cpp rootroot G
8、+#less me.s.globl _Z9CppPrintfv/注意此函数的命名.type CppPrintf,function rootroot GCC#gcc-S me.cpp rootroot GCC#less me.s.globl _Z9CppPrintfv/注意此函数的命名.type CppPrintf,function 完全相同!2.去掉 me.h 中 extern C,看用 gcc 和 g+命名有什么不同rootroot GCC#gcc-S me.cpp rootroot GCC#less me.s.globl _Z9CppPrintfv/注意此函数的命名.type _Z9Cpp
9、Printfv,function rootroot G+#g+-S me.cpp rootroot G+#less me.s.globl _Z9CppPrintfv/注意此函数的命名.type _Z9CppPrintfv,function 完全相同!【结论】完全相同,可见 extern C与采用 gcc/g+并无关系,以上的试验还间接的印证了前面的说法:在编译阶段,g+是调用 gcc 的。二:今天,我们继续gcc 之旅吧。上节我们讲了些gcc 的历史发展什么的,还有就是gcc与 g+的区别。今天我们就从整体上对gcc 编译过程有个细致的了解,也好明白他的工作原理,好为以后深入学习研究打下个基础
10、。gcc 的编译流程分为四个步骤,分别为:预处理(Pre-Processing)编译(Compiling)-hello.i 汇编(Assembling)-hello.s 链接(Linking)以 hello.c 为例子,在这四个步骤中可以设置选项分别生成hello.i,hello.s,hello.o 以及最终的hello 文件:hello.c:最初的源代码文件;hello.i:经过编译预处理的源代码;hello.s:汇编处理后的汇编代码;hello.o:编译后的目标文件,即含有最终编译出的机器码,但它里面所引用的其他文件中函数的内存位置尚未定义。hello/a.out:最终的可执行文件名师资料
11、总结-精品资料欢迎下载-名师精心整理-第 3 页,共 14 页 -(还有.a(静态库文件),.so(动态库文件),.s(汇编源文件)留待以后讨论)下面就具体来查看一下gcc 是如何完成四个步骤的。hello.c 源代码#include int main()printf(Hello World!n);return 0;(1)预处理阶段在该阶段,编译器将上述代码中的stdio.h 编译进来,并且用户可以使用gcc 的选项”-E”进行查看,该选项的作用是让gcc 在预处理结束后停止编译过程。深入理解计算机系统中是这么说的:预处理器(cpp)根据以字符#开头的命令(directives),修改原始的C
12、 程序。如hello.c 中#include 指令告诉预处理器读系统头文件stdio.h 的内容,并把它直接插入到程序文本中去。结果就得到另外一个C 程序,通常是以.i 作为文件扩展名的。注意:Gcc 指令的一般格式为:Gcc 选项 要编译的文件选项 目标文件 其中,目标文件可缺省,Gcc 默认生成可执行的文件名为:编译文件.out ganlocalhost gcc#gcc E hello.c o hello.i 选项”-o”是指目标文件,”.i”文件为已经过预处理的C 原始程序。以下列出了hello.i 文件的部分内容:typedef int(*_gconv_trans_fct)(struc
13、t _gconv_step*,struct _gconv_step_data*,void*,_const unsigned char*,_const unsigned char*,_const unsigned char*,unsigned char*,size_t*);#2 hello.c 2 int main()printf(Hello World!n);名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 14 页 -return 0;由此可见,gcc 确实进行了预处理,它把”stdio.h”的内容插入到hello.i 文件中。(2)编译阶段接 下来进行的是编译阶段,在这个阶段中
14、,Gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc 把代码翻译成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。汇编语言是非常有用的,它为不同高级语言不同编译器提供了通用的语言。如:C 编译器和Fortran编译器产生的输出文件用的都是一样的汇编语言。ganlocalhost gcc#gcc S hello.i o hello.s 以下列出了hello.s 的内容,可见Gcc 已经将其转化为汇编了,感兴趣的读者可以分析一下这一行简单的C 语言小程序是如何用汇编代码实现的。.file hello.c.se
15、ction.rodata.align 4.LC0:.string Hello World!.text.globl main.type main,function main:pushl%ebp movl%esp,%ebp subl$8,%esp andl$-16,%esp movl$0,%eax addl$15,%eax addl$15,%eax shrl$4,%eax sall$4,%eax subl%eax,%esp subl$12,%esp pushl$.LC0 call puts addl$16,%esp movl$0,%eax leave 名师资料总结-精品资料欢迎下载-名师精心整理-
16、第 5 页,共 14 页 -ret.size main,.-main.ident GCC:(GNU)4.0.0 20050519(Red Hat 4.0.0-8).section.note.GNU-stack,progbits(3)汇编阶段汇编阶段是把编译阶段生成的”.s”文件转成目标文件,读者在此可使用选项”-c”就可看到汇编代码已转化为”.o”的二进制目标代码了。如下所示:ganlocalhost gcc#gcc c hello.s o hello.o(4)链接阶段在成功编译之后,就进入了链接阶段。在这里涉及到一个重要的概念:函数库。在这个源程序中并没有定义”printf”的函数实现,且在
17、预编译中包含进的”stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现”printf”函数的呢?最后的答案是:系统把这些函数实现都被做到名为libc.so.6 的库文件中去了,在没有特别指定时,gcc会到系统默认的搜索路径”/usr/lib”下进行查找,也就是链接到libc.so.6 库函数中去,这样就能实现函数”printf”了,而这也就是链接的作用。函数库一般分为静态库和动态库两种。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为”.a”。动态库与之相反,在编译链接时并没有把库文件的代
18、码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为”.so”,如前面所述的libc.so.6 就是动态库。gcc 在编译时默认使用动态库。(Linux 下动态库文件的扩展名为.so(Shared Object)。按照约定,所有动态库文件名的形式是 libname.so(可能在名字中加入版本号)。这样,线程函数库被称作libthread.so。静态库的文件名形式是libname.a。共享 archive 的文件名形式是libname.sa。共享 archive 只是一 种过渡形式,帮助人们从静态库转变到动态库。)完成了链接之后,gcc 就可以
19、生成可执行文件,如下所示。ganlocalhost gcc#gcc hello.o o hello 运行该可执行文件,出现正确的结果如下。rootlocalhost Gcc#./hello Hello World!三:这一节,我们来关注下gcc 的常用参数,有机会也好多加练习啦。首先来看看我们gcc 的版本吧,gcc-version 这个命令就会显示gcc 的版本号啦。好啦,下名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 14 页 -面开始下面开始讲解gcc 的常用参数啦o(_)o.参数详解 -c 只激活预处理,编译,和汇编,也就是他只把程序做成obj 文件例子用法:gcc-c
20、 hello.c 他将生成.o 的 obj 文件-S 只激活预处理和编译,就是指把文件编译成为汇编代码。例子用法gcc-S hello.c 他将生成.s 的汇编代码,你可以用文本编辑器察看-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.例子用法:gcc-E hello.c pianoapan.txt gcc-E hello.c|more 慢慢看吧,一个 hello word 也要与处理成800 行的代码-o 制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,很难听,如果 你和我有同感,改掉它,哈哈例子用法gcc-o hello.exe hello.c(哦,w
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年gcc入门教程 2022 gcc 入门教程
限制150内