ADD: linux/command.md -> iperf3 FIX: program/c_cpp/universal/libs.md -> errno DEL: program/c_cpp/libs/log/ program/c_cpp/libs/dbtools.h
2.7 KiB
2.7 KiB
gcc-g++ 编译器
目录
option
-
-S
: 编译成汇编文件 -
-c
: 目标文件 -
-o
: 链接 -
-g
: 调试 -
-D <MACRO_NAME>
定义一个宏,默认值为1 -
-U <MACRO_NAME>
取消定义 -
-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
静态库制作:
g++ -c test.cpp
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=.
将运行时路径嵌入到可执行文件中,强制程序运行时优先从当前目录加载动态库