我正在尝试在创建共享库的 CMake 项目上使用 LLVM 应用链接时间优化。我的问题和这个问题差不多:
Switching between GCC and Clang/LLVM using CMake .
但是,答案似乎不再适用,因为新版本中不存在 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 运行其他步骤吗?
最佳答案
使用 Clang 和启用 LTO 的正确方法是在编译 和 链接时对 clang
命令行使用 -flto
标志.
此外,您将需要在具有直接支持 LTO(通常是 Apple 平台)或具有 LLVM 链接器插件(使用 Gold 链接器的 Linux,但我认为有些人已经获得 BFD)的链接器的平台上工作链接器也支持链接器插件)。如果您使用的是链接器插件,则需要确保您安装的 LLVM 已构建并安装了该插件。如果是这样,当使用 -flto
链接时,Clang 将自动添加必要的链接器命令行选项以使用插件,即使对于共享对象也是如此。
另外,LLVM 项目正在开发一个新的链接器 (LLD),它将在它支持的所有平台上支持开箱即用的 LTO,但它仍处于早期阶段。目前我知道有人在 Windows 和 Linux 上测试了它的 LTO 支持,它似乎运行良好,但仍然缺少许多功能。
关于c++ - LTO 与 LLVM 和 CMake,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35922966/