(1)GCC主要包括以前一些工具:
cpp(预处理器)、gcc(c编译器)、g++(c++编译器)等编译器以及binutils等二进制工具.
其中,binutils是辅助GCC的主要软件,常用的工具有:as(汇编器)、ld(链接器)等.
(2)一般来说,面向c程序的gcc编译过程主要分4个阶段:
1、预处理阶段,完成宏定义和include文件展开等工作.
2、根据编译参数进行不同程度的优化,编译成汇编代码.
3、用汇编器将汇编代码进一步生成目标代码.
4、用连接器将生成的目标代码和系统用户提供的库链接起来,生成可执行文件.
因此,Linux下的gcc是一个能生成可执行文件的编译器.
(3)gcc是符合ISO标准的c编译器,它在需要的时候调用其它组件(预处理器、汇编器和链接器).具体上gcc调用哪些组件是由输入文件的类型和传给gcc的参数决定的.
(4)gcc识别的主要文件扩展名:
.c c语言代码
.C,.cc c++语言代码
.i 预处理后的c语言代码
.ii 预处理后的c++语言代码
.s,.S 汇编语言代码
.o 目标代码
.a 静态链接库(程序编译时使用)
.so 动态链接库(程序运行时使用)
(5)gcc编译控制选项
-E 只运行c预处理器cpp,生成.i文件,并停止工作
-S 生成汇编代码后输出汇编代码,生成.s文件,并停止工作
-c 只生成object文件,不链接,生成.o文件,并停止工作
-o FILE 生成指定的输出文件"FILE",生成可执行文件
-g 生成被gdb使用的标准调试信息
-w 不生成任何警告信息
-Wall 生成所有级别的警告信息
举例:
gcc -E hello.c -o hello.i //只运行c预处理器cpp
gcc -S hello.i -o hello.s //生成汇编代码后输出汇编代码
gcc -c hello.s -o hello.o //只生成object文件,不链接
gcc hello.o -o hello.elf //生成Linux下的可执行文件hello.elf
也可一步到位:
gcc hello.c -o hello.elf //直接生成Linux下的可执行文件hello.elf
Attention!!!
编译选项"-o"(可理解为output)后必须加上生成文件的名字.
另外,Linux中系统并不识别文件的类型,这只是为了用户理解方便才添加的.
(6)gcc优化处理的编译选项
-O0 不进行代码优化处理
-O1 进行一般优化,减少大小和时间
-O2 进一步优化,一般在内核编译时使用(常用)
-O3 较-O2进一步优化
在Linux中,常用的编译选项是:gcc file.c -o file.elf -Wall -O2
(7)gcc在函数库中的应用
gcc可以编译动态函数库,也可以编译静态函数库.详细使用详见博客"静态链接库和静态链接库".
-I DIR 指定额外的头文件搜索路径DIR
-L DIR 指定额外的库函数搜索路径DIR
-l LIBRARY 指定链接时需要的其它函数库"LIBRARY"
-shared 生成支持动态共享库的执行文件
-static 不支持动态共享库,把函数库内容静态链接到可执行程序中
原文链接:http://blog.chinaunix.net/u3/119265/showart_2344020.html
这里: -lm表示-l libm.so或者libm.a,如此类推