# gcc-g++ 编译器 ## 目录 - [编译选项](#option) - [优化等级](#level) - [制作库文件](#make-lib) ## **option** - `-S` : 编译成汇编文件 - `-c` : 目标文件 - `-o` : 链接 - `-g` : 调试 - `-D ` 定义一个宏,默认值为1 - `-U ` 取消定义 - `-l` : 链接库名称 - `-L` : 链接库位置 - `-I` : 头文件位置 - `-Wall` : 启动所有常见警告 - `-fPIC` : 生成位置无关代码 - `-MMD` : 自动生成`.d`文件,记录源文件与头文件的依赖关系,头文件修改后自动触发相关源文件重编译 - `gcc -s` 剥除可执行文件中的符号表和重定位信息 - **正常功能保持** - **性能无显著差异** - **调试困难和反汇编不便** : 使用 `-s` 选项后,符号表信息会被移除,使得调试变得非常困难,反汇编工具无法显示函数名和变量名等信息,只能显示汇编指令和地址 - `g++ -S -o - -fverbose-asm xxx.cpp > xxx.s` // 输出带注释的汇编 --- ### **level** - **O0** 不进行任何优化 - **O1** 基础优化 - 删除未使用的变量和函数 - 简化控制流(如合并重复代码) - 常量折叠(如 2+3 替换为 5) - 简单的寄存器分配 - **O2** 中等优化,推荐级别 - 指令调度(提高指令级并行性) - 循环优化(如循环展开、循环不变代码外提) - 函数内联(简单函数直接展开) - 分支预测优化 - 数据流分析优化 - **O3** 激进优化 - 更激进的循环优化(如自动向量化,利用 SIMD 指令如 SSE/AVX) - 函数内联更积极(可能导致代码膨胀) - 删除冗余内存访问 - 数学表达式重构(可能影响浮点精度) - **优化易导致的问题** - 暴露未定义行为(Undefined Behavior, UB) - 调试信息不匹配 - 重新排列或合并浮点运算,导致精度损失 - 代码体积膨胀 - 重排内存访问顺序,影响多线程程序或硬件寄存器操作 - 依赖时序的代码失效 - 向量化(SIMD)导致的兼容性问题 - 内联汇编的意外行为 - **Os** - 减小体积 --- ## make-lib --- ### 静态库制作: 1. `g++ -c test.cpp` 2. `ar rcs libtest.a test.o` --- ### 动态库制作 `g++ -fPIC -shared -o libtest.so {test.cpp 源代码文件清单}` --- ### 库使用 g++ -o main -l库名 -L库路径 -I头文件路径 #### 编译主程序时链接动态库 - `gcc -o myprogram main.c -L. -lmylib -Wl,-rpath=.` - `-L.` 告诉编译器在当前目录中查找动态库文件 - `-lmylib` 链接名为 libmylib.so 的动态库 - `-Wl,-rpath=.` 将运行时路径嵌入到可执行文件中,强制程序运行时优先从当前目录加载动态库