LTO(Link Time Optimization,链接时优化)是一种 跨文件的代码优化技术,它在最终链接阶段对整个程序做全局优化,提高性能或减小体积。它的作用可以总结为:
🔧 LTO 的作用与优势
build_flags = -flto
✅ 1. 跨翻译单元优化
普通编译器在每个 .c 或 .cpp 文件独立优化(翻译单元),不能看到其他文件的函数定义或使用情况。
LTO 则在链接时看到所有代码(包括不同文件中的函数/变量),因此能做:
- 函数内联(跨文件)
- 未使用代码删除(全局死代码删除)
- 常量合并
- 更强的优化传递(比如变量作用域缩小)
✅ 2. 更小的程序体积
- 通过消除跨文件的重复代码或未用到的函数。
✅ 3. 更快的执行速度
- 更多函数可以被内联,尤其是在嵌入式场景(如 STM32)中对函数调用代价较高时效果更明显。
⚠️ LTO 的劣势或注意事项
❌ 1. 编译/链接时间更长
- 所有对象文件都需在链接时重新解析并优化。
❌ 2. 兼容性问题
- 某些工具链(如旧版
arm-none-eabi-gcc)对 LTO 支持不完善。 - 汇编代码(如
.s文件)不能被 LTO 优化,容易导致链接失败,尤其是用naked函数或startup.s时。
❌ 3. 调试困难
- 开启 LTO 后,函数名可能消失或被内联,调试器里不易定位源代码位置。
🛠️ 如何在 PlatformIO 使用或禁用 LTO
[env:bluepill_f103c8]
platform = ststm32
board = bluepill_f103c8
framework = cmsis
build_flags = -flto ; ✅ 开启 LTO
; build_flags = -fno-lto ; ❌ 禁用 LTO
💡 总结
| 优点 | 缺点 |
|---|---|
| + 更小的代码体积 | - 编译/链接时间变长 |
| + 更快的运行速度 | - 调试难度增加 |
| + 跨文件优化能力强 | - 与裸汇编或部分库不兼容 |
是否建议开启?
- ✅ 应用代码纯 C/C++ 并追求极致优化时可以开启。
- ❌ 存在 startup.s、裸汇编或兼容性问题(如你当前项目)时,建议关闭。
如果不再用裸汇编(如 .s 文件),可以重新尝试开启 LTO。
368

被折叠的 条评论
为什么被折叠?



