“UNIX系统开发-gcc参数详解"学习笔记
时间:2007-01-17 来源:5204669
GCC最早是Richard Stallman在十几年前编写的针对于C的编译器,意思即为GNU C Compiler,后来发展支持Ada,C++,Java,Objective C,Pascal,COBOL,以及支持逻辑编程的Mercury语言,后来其英文原名变为:GNU Compiler ollection([1]).除此之外,GCC对于各种硬件平台都提供了完善的支持。
“UNIX系统开发-gcc参数详解"学习笔记 |
对于程序员来说,编译器的重要性不容置疑,深入了解译器是对工作大有帮助的,所以写下这个学习笔记,希望能借此学到更多东西。 偶然看到这篇文章,边读边记录一下自己的阅读笔记,希望能得到更多收获,也希望能为读这篇文章的人以帮助,建议大家读原文,以得到更多收获,感谢email为[email protected]的GG写这篇文章,给我有机会继续了解编译器的参数问题。文中基本上按原本的架构走,对一些细节的地方进行了祥细的解释,有些细节配上了例子,以方便理解,希望能有些帮助。 我的email: [email protected] 主要参考文献请见: http://www.chinaunix.net/jh/7/235728.html 一.gcc历史 GCC最早是Richard Stallman在十几年前编写的针对于C的编译器,意思即为GNU C Compiler,后来发展支持Ada,C++,Java,Objective C,Pascal,COBOL,以及支持逻辑编程的Mercury语言,后来其英文原名变为:GNU Compiler ollection([1]).除此之外,GCC对于各种硬件平台都提供了完善的支持。 一般的,GCC的编译功能包括gcc(C的编译器),g++(C++的编译器),在编译过程中,一共有四步工作。 1.预处理,生成i文件,C文件编译为.i文件,C++文件编译为.ii文件,它们都为源程序的预处理结果文件.以最简单的Hello World程序为例:
*********************************
int main() 用cpp test.c test.i 可得到预处理文件test.i,通过查看该文件,我们可以看到,我们引入的include文件已经被引入处理,define定义的部分已经被完全带入。 2.预处理文件转换成汇编语言,生成.s文件。这一步利用egcs来完成(在mingw标准包中没有见到这个预编译器,所以测试没有成功,将继续测试) 3.汇编变为目标文件,生成.o文件,利用as来完成。 4.连接目标文件,生成可执行程序,利用ld来完成.(后续继续研究ld编译过程。)
-x language filename
-x none filename
-c
-S
-E
-o
-pipe
-ansi
-fno-asm
-fthis-is-variable
-fcond-mismatch
-funsigned-char
-include filename -include ./include/test.h,进行联编。
-imacros filename
-Dmacro
int main()
如用gcc -o test.exe test.c编译,刚运行结果为: 因此可以在下一种编译方法中相当于在test.c里面定义了DEBUG宏。
-Dmacro=define
-Umacro
-undef
-Idir
-I-
-idirafter dir
-iprefix prefix
-nostdinc
-nostdinc C++
-C
-M
-MM
-MD
-MMD
-Wa,option
-Wl,option
-llibrary
-Ldir
-00
-g
-gstabs
-gstabs+
-ggdb
-static
-share
-traditional
gcc的参数还远远多于上面写到的这些,但是有以上的参数我们已经可以对gcc的大部分编译掌握的比较熟练了,更多的参数介绍可以参照GCC的manual,现在已有翻译了的中文手册,地址在下面的参考文献里面被列出,有兴趣的朋友可以参考。 |