我正在尝试在创建共享库的 CMake 项目上使用 LLVM 应用链接时间优化。我的问题和这个问题差不多:
使用 CMake 在 GCC 和 Clang/LLVM 之间切换。
但是,答案似乎不再适用,因为新版本中不存在 llvm-ld
。在命令行上,我运行以下命令来获取 LTO(假设只有 2 个 .cpp
文件):
编译成字节码:
clang++ -c FirstClass.cpp -O3 -flto -o FirstClass.bc
clang++ -c SecondClass.cpp -O3 -flto -o SecondClass.bc
链接字节码:
llvm-link FirstClass.bc SecondClass.bc -o unoptimized.bc
优化字节码:
opt -O3 unoptimized.bc -o optimized.bc
将字节码转换为共享对象:
clang++ -shared optimized.bc -o libTest.so
有人可以告诉我如何让 CMake 运行其他步骤吗?
原文由 SPMP 发布,翻译遵循 CC BY-SA 4.0 许可协议
使用 Clang 和启用 LTO 的正确方法是在编译 和 链接时使用
clang
命令行的-flto
标志。此外,您将需要在具有直接支持 LTO(通常是 Apple 的平台)或具有 LLVM 链接器插件(使用 Gold 链接器的 Linux,但我认为有些已经获得 BFD 链接器支持)的链接器的平台上工作链接器插件也是如此)。如果您使用的是链接器插件,则需要确保您安装的 LLVM 已构建并安装了该插件。如果是这样,当与
-flto
链接时,Clang 将自动添加必要的链接器命令行选项以使用插件,即使对于共享对象也是如此。此外,LLVM 项目正在开发一个新的链接器 (LLD),它将在它支持的所有平台上开箱即用地支持 LTO,但它仍处于早期阶段。目前我知道有人在 Windows 和 Linux 上测试它的 LTO 支持,它似乎运行良好,但仍然缺少许多功能。