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

2.7 KiB
Raw Blame History

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


静态库制作:

  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=. 将运行时路径嵌入到可执行文件中,强制程序运行时优先从当前目录加载动态库