如何实现链接时剔除冗余函数且无需重复编译库?
解决方案
首先修正main.lib的编译错误:原代码中GetFlag()作为constexpr函数返回非constexpr的sFlag会导致编译失败,必须移除GetFlag()的constexpr修饰符,使其成为普通成员函数。基于你“不修改Application.hpp即不重新编译main.lib”的要求,默认main.lib已基于修正后的头文件编译完成。
接下来通过链接时优化实现目标:
Windows MSVS平台配置
- 打开对应应用项目属性,开启链接时间代码生成:
配置属性 → C/C++ → 所有选项 → 链接时间代码生成 → 选择/LTCG或/LTCG:INCREMENTAL - 确认启用引用优化:
配置属性 → 链接器 → 优化 → 引用 → 设置为/OPT:REF
Linux Clang平台编译命令
编译链接时添加LTO和垃圾回收参数:
clang -flto -Wl,--gc-sections main.lib Application.cpp -o app
原理
开启链接时优化(LTO)后,链接器可获取main.lib与Application.cpp的全部中间代码,推导sFlag的实际值并将main函数中的无用分支完全优化。配合链接器垃圾回收选项(MSVS的/OPT:REF、Clang的--gc-sections),未被调用的Func1或Func2会被从最终二进制中剔除,既无需重复编译main.lib,也能保证二进制仅包含必要逻辑。
内容的提问来源于stack exchange,提问作者Wolfie
相关产品推荐
相关产品推荐

