优化程序大小编译选项
1. gcc
1.1 编译选项
选项 | 作用 |
---|
-O3 | 启用最大优化,适用于 Release |
-ffunction-sections | 每个函数放入自己的段 |
-fdata-sections | 每个全局变量放入自己的段 |
-fvisibility=hidden | 默认隐藏符号,避免导出未用的函数(用于 .so ) |
-fno-rtti (可选) | 禁用 RTTI,适用于非多态代码(小幅减少体积) |
1.2 链接选项
选项 | 作用 |
---|
-Wl,--gc-sections | 丢弃未使用函数或变量的段(配合 -ffunction-sections ) |
-Wl,-s 或 -s | 去除符号表和调试信息(最小化产物) |
1.3 cmake示例
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -ffunction-sections -fdata-sections -fvisibility=hidden")set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -Wl,--gc-sections -s")
endif()
2. msvc
2.1 msvc编译选项
选项 | 作用 |
---|
/O2 | 最大优化(Release 默认) |
/GL | 启用 Whole Program Optimization(必须与 /LTCG 配合使用) |
/Gw | 全局变量的函数级链接(VC++ 2022+) |
/Gw- | 禁用全局变量函数级链接(仅调试时) |
/GF | 合并只读字符串常量 |
/Gy | 函数级链接,配合 /OPT:REF |
2.2 链接选项
选项 | 作用 |
---|
/LTCG | 启用 Link Time Code Generation(与 /GL 配合使用) |
/OPT:REF | 删除未引用的函数和数据 |
/OPT:ICF | 合并相同的代码和数据段(Identical COMDAT Folding) |
/INCREMENTAL:NO | 禁用增量链接(必须禁用,才能让 /LTCG 生效) |
/SUBSYSTEM:WINDOWS | 如果你是 GUI 应用(无控制台窗口) |
2.3 对应cmake
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) # 等价于 /GL + /LTCGif (MSVC)add_compile_options(/O2 /Gy /Gw /GF /GL) # 编译器优化add_link_options(/LTCG /OPT:REF /OPT:ICF /INCREMENTAL:NO /SUBSYSTEM:CONSOLE)
endif()
3. 效果
静态链接opencv库:40MB->17MB