For the GNU Compilers gcc and g++
编译流程
-
预处理 宏展开
$ cpp -E hello.c > hello.i
-E
仅仅运行预处理器输出宏展开结果 -
编译 源代码编译成汇编语言
$ gcc -S hello.i
-S
仅仅运行预处理器和编译步骤输出hello.s
-
汇编 汇编语言到机器码
$ as hello.s -o hello.o
$ gcc -c -save-temps hello.c -o hello.o
-c
预处理、编译、汇编
-save-temps
保存中间编译结果hello.i
-
链接 链接对象生成可执行程序
$ ld -dynamic-linker hello.o -lgcc ...
与次序相关的选项
搜索外部函数的次序是在命令行上指定的对象文件中 从左到右查找。 包含函数定义的对象文件应当出现在调用这些函数的任何文件之后。
- -l library 链接库名简写形式,展开为
liblibrary.a
liblibrary.so
,-lx
会在搜索路径中查找,而liblibrary.so
不会。 - -static 优先链接静态库(默认
-shared
) - -fPIC 生成位置无关的共享库
- -Wl,-rpath=./ 将链接库路径写入可执行程序(同
LD_RUN_PATH
,优先使用命令选项-Wl,-rpath=./
,若无指定则使用环境变量)。
include 路径
- -I
- C_INCLUDED_PATH
- CPP_INCLUDED_PATH
- 默认头文件搜索路径
库搜索路径
- -L
- LIBRARY_PATH
- LD_LIBRARY_PATH 运行时搜索共享库路径
- 默认库搜索路径
常用编译选项
- -std 指定语言标准
- -M 打印依赖文件
- -Wall 所有常见错误警告
- -W 常见编程错误产生警告
- -Werror 把警告转为错误
- -D marco 定义宏
- -g 存储调试信息
-
-Ox 优化选项
-O0
没有优化 -O1
不需要任何速度-空间折衷的最常见形式的优化 -O2
包括指令调度 -O3
更深度的优化,可能增加可执行文件大小 -Os
缩减可执行文件大小的优化 -funroll-loops
循环展开
-Wall
与-W
通常同时使用- GNU 发行的软件包默认都打开了调试选项
-g
和优化选项-O2
平台编译选项
- -march 为特定的体系结构生成可执行程序
- -mcpu 在速度与可移植性方面提供了折衷方案
- -m32 允许在64位上生成32位代码(
-m64
) - -mcmodel 内存模型限定代码及数据规模
相关工具
- ar 创建静态库
- gprof 性能剖析(
-pg
) - gcov 代码覆盖测试(
-ftest-coverage -ftest-coverage
)
其它
- file 辨识文件
- nm 显示符号表
- ldd 查找动态库
- ldconfig 更新共享库软链接
- readelf -d sharedlibrary 查看信息
- 共享库全名
libstdc++.6.0.1
(libstdc++.Major.Minor.Release
) 主版本不兼容,次版本向下兼容,发布版本相互兼容。