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.aliblibrary.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) 主版本不兼容,次版本向下兼容,发布版本相互兼容。