如何编译小体积LLVM源码以满足自研优化器开发需求
问题解答
1. 原编译命令的正确性判断
原命令存在参数冲突问题:你重复定义了CMAKE_BUILD_TYPE参数,先设为RelWithDebInfo后又设为Release,CMake执行时仅最后传入的Release会生效,前面的RelWithDebInfo配置完全无效。
剩余其他参数均为合理配置:
-DLLVM_TARGETS_TO_BUILD=HOST:仅编译当前主机架构对应的后端,相比全量编译所有架构可缩减70%以上的编译产物体积,同时大幅降低编译耗时-DBUILD_SHARED_LIBS=on:启用动态链接,相比静态链接可降低编译时内存占用,同时编译出的二进制体积仅为静态版本的1/3左右
2. Release模式对优化器开发调试的影响
纯Release模式确实不会生成调试符号,对你的开发会造成以下阻碍:
- 断点无法进入LLVM原生代码,也无法查看LLVM内部变量、调用栈信息,排查你开发的优化器组件和LLVM框架的交互问题时难度会大幅提升
- 仅能调试你自己编写的优化器代码,前提是你自己的代码编译时主动添加了
-g调试参数
折中方案推荐
建议你删除重复的-DCMAKE_BUILD_TYPE=Release参数,保留-DCMAKE_BUILD_TYPE=RelWithDebInfo即可:
- 该模式会保留完整调试符号,同时启用O2优化,运行性能和Release模式几乎无差异
- 产物体积仅为纯Debug模式的30%左右,完全满足你本地承载的需求
额外体积优化建议
你可以补充以下参数进一步压缩产物体积,适配低配置本机环境:
- 添加
-DLLVM_BUILD_TOOLS=OFF关闭无关LLVM工具编译,若需要Clang前端可额外添加-DCLANG_BUILD_TOOLS=ON单独启用Clang编译 - 添加
-DLLVM_ENABLE_ASSERTIONS=ON,开发阶段开启断言可以提前捕获框架调用错误,对体积和性能影响极小 - 编译完成后可通过
strip命令剥离动态库、可执行文件的冗余符号,进一步减少体积,可单独留存一份未strip的版本用于调试
内容的提问来源于stack exchange,提问作者Shane
相关产品推荐
相关产品推荐

