1. 主要组成部分
1.1. 预处理器
预处理器(Preprocessor),主要完成头文件展开,宏替换,消除注释等,生成C代码文件.i。在.i文件中,我们可以看到展开后的头文件是怎么样的,可以看到替换后的宏是什么样的。
gcc -E main.c -o main.i
g++ -e main.cpp -o main.ii
1.2. 编译器
编译器(Compiler),主要是将标准C/CPP文件编译成汇编文件。在.s文件中,我们可以看到生成的汇编指令。
gcc/g++ -S main.i -o main.s
1.3. 汇编器
汇编器(Assembler),主要是将C/C++文件汇编成二进制文件(.o文件)。
gcc/g++ -c main.s -o main.o
// 可以一步到位将代码汇编成二进制文件
gcc -c main.c -o main.o
g++ -c main.cpp -o main.o
1.4. 链接器
链接器(Linker),主要是完成一些地址重定位,优化等,然后将二进制文件链接成一个执行文件。
gcc/g++ main.o -o main
// 一步到位
gcc main.c -o main
g++ main.cpp -o main
2. 相关文件
- .c/.C,C语言文件。
- .h文件。
- .cc/.cpp/.cxx,C++语言文件。
- .i,预处理之后的C语言源文件。
- .ii,预处理之后的C++语言源文件。
- .s/.S,汇编语言文件。
3. 常用指令
3.1. 查看版本号
-v/–version
3.2. 显示帮助信息
–help
3.3. 指定头文件目录
// 添加搜索头文件的路径dir
-I dir
3.4. 指定宏
// 相当于定义宏
-D _DBG
-D MAX_BLK=1024
3.5. 取消宏
// 相当于#undef MACRO
-U _DBG
3.6. 添加文件
// 相当于#include “xx.h”
-include file
3.7. 生成警告信息
-Wall
3.8. 扩展警告信息
// 更深入的警告分析,有一定静态分析的作用
-Wextra
3.9. 编译优化
编译优化有4个级别,级别越大优化效果越好,编译时也越长
-O0/-O1/-O2/-O3
3.10. 生成调试信息
// 生成调试信息供gdb使用
-g
3.11. 阻止链接共享库
// 在支持动态连接(dynamic linking)的系统上,阻止连接共享库.该选项在其他系统上无效
// 链接静态和隐式链接动态库一样,可以用引指令阻止链接静态库
-static
3.12. 共享链接相关库
// 共享链接相当于所有可执行文件共享外部动态标准库,所占空间小
// 运行时需要包括外部动态库
-share
3.13. 指定库搜索路径
// 添加搜索库文件的目录dir
-Ldir
3.14. 指定链接库名
// 指定链接名为Liblibary.a的库文件
-llibrary
3.15. 指定语言标准
指定c99编译
gcc -std=c99
指定C++11编译
g++ -std=c++11
3.16. 生成位置无关代码
// 针对动态库,使用此指令生成与位置无关代码,可以达到真正共享动态库的效果,如果不使用此指令,动态库共享是通过代码拷贝来实现的
gcc -fPIC -shared -o Add.so add.c sub.c
4. 示例
- 默认
// 直接在当前目录生成同名的main可执行文件,不产生调试信息
gcc main.c
- 生成指定名字的可执行文件
// windows下
gcc main.c -o main.exe
// Linux下
gcc main.c -o main
- 编译多个源文件并链接成可执行文件
gcc -c add.c main.c
// gcc已经支持通配符,编译当前目录所有.c文件
gcc -c *.c
gcc add.o main.o -o main
- 编译链接多个源文件
gcc add.c main.c -o main
- 指定搜索头文件
gcc -I ./include add.c main.c -o main
- 生成动态库
// 生成共享系统库的动态库
gcc -shared add.c sub.c -o add.so
- 链接静态库
// 指定从当前目录中链接libadd.a
// -L./指定当前目录为库搜索目录
// 注意-ladd要放在最后面
gcc -o main.out main.c -L./ -ladd
- 隐式链接动态库
// Windows下
gcc -o m.exe add.so main.c
// Linux下隐式链接的方式和链接静态库的方式相同,链接libAdd.so
g++ -o main.out main.cpp -L./ -lAdd
- 综合
// 指定语言版本C99,指定预定义宏,指定警告类型,指定优化级别,指定生成调用信息,编程当前目录所有c文件,指定生成文件名
gcc -D _DBG -std=c99 -Wall -Wextra -O3 *.c -o main.out
// 运行生成文件
./main.out