1、gcc编译过程有四步(预处理、汇编、编译、链接)
gcc -E xxx.c 表示预处理,生成*.i文件
gcc -S xxx.i 表示汇编,生成*.s文件
gcc -C xxx.s 表示只编译不链接,生成*.o文件
gcc xxx.o 就是链接文件
gcc xxx.c -I pathname 编译查找头文件的目录在指定的pathname
gcc -static xxx.c 表示编译链接成静态文件
gcc xxx.o -l库名字 -L库的路径 将xxx.o与指定库链接
gcc -fpic 小模式,生成代码少
gcc -ldl 表示动态加载库文件
gcc -std 按标准c编译
gcc -wall 显示所有的警告
gcc -werror 显示警告和错误
gcc -v 显示gcc版本信息
2、预处理(在预处理阶段执行)
#line 200 表示这句后面开始行号从200开始计数
#warning "字符串" 显示警告信息
#error"字符串" 显示错误信息,后面不会编译代码
#pragma GCC dependency 文件名
表示当前文件依赖于指定的文件名,如果指定的文件最后一次修改时间晚于但前文件,则产生警告信息。可以判断调用函数修改时间是不是比当前文件新。
#pragma GCC poison 标识符
将标识符设置为毒药,如果后面代码使用的后面的标识符,则会报错。
#pragma pack(整数n)
表示按照n的倍数进行对齐和补齐。超过4则按照4对齐。
3、预订义宏
__BASE_FILE__ 获取正在编译的文件名
__FILE__ 获取当前宏所在的文件名
__LINE__ 获取当前宏所在的行号
__FUNCTION__ 当前宏所在的函数名
__DATE__ 获取日期
__TIME__ 获取时间
4、一些常见的环境变量
PATH 系统环境变量
CPATH/C_INCLUDE_PATH C头文件的附加搜索目录
CPULS_INCLUDE_PATH C++头文件附加搜索目录
LIBRARY_PATH 链接库文件时查找目录
LD_LIBRARY_PATH 运行时查找共享库的路径
5、库文件
1. 静态库文件(*.a)
使用时将代码直接复制到功能代码中,不用依赖库的源文件,但编译后文件比较大,修改和维护不方便。
生成静态库:
- 只编译不链接 gcc -c xxx.c生成xxx.o文件
- 生成静态库文件 ar -r libxx.a xxx.o 表示把xxx.o文件插入到库libxx.a中
2. 共享库文件(*.so)
使用时将代码的指针复制到功能代码中,编译后文件比较小,维护也方便,但依赖于库的源文件。
ldd xxx执行文件 表示查看xxx链接的库
生成共享库:
- 只编译不链接:gcc -c -fpic xxx.c
- 生成动态库: gcc -shared xxx.o -o libxx.so