c++ - LTO 与 LLVM 和 CMake

标签 c++ cmake clang llvm lto

我正在尝试在创建共享库的 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/

相关文章:

c++ - CMake 3.8.0 在 makefile 中生成错误的链接命令

c - 我的分号怎么了? (gcc 预处理器)

c++ - 图组件之间的路径算法

c++ - 在 Release模式下禁用从 C++ 中的基类继承

c++ - 如何在另一个程序中使用在一个程序中声明的变量?

c++ - cocos2dx错误: opengl version too old

未找到 CMAKE 中的 Python_LIBRARIES

c++ - GDB Backtrace 不使用 cmake 显示函数名称

xcode - ld : file not found:/Library/Developer/. ../libclang_rt.ubsan_osx_dynamic.dylib

ios - Clang 在 objective-c 中因退出代码 1 错误而失败