material/program/tool/gcc_g++.md
rangersly d05beb0f1f MERGE: fix
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
2025-06-02 09:06:01 +08:00

85 lines
2.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# gcc-g++ 编译器
## 目录
- [编译选项](#option)
- [优化等级](#level)
- [制作库文件](#make-lib)
## **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
---
### 静态库制作:
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=.` 将运行时路径嵌入到可执行文件中,强制程序运行时优先从当前目录加载动态库