【问题标题】:Using LLVM linker when using Clang & CMake使用 Clang 和 CMake 时使用 LLVM 链接器
【发布时间】:2012-05-04 10:29:03
【问题描述】:

告诉 CMake 使用 LLVM 链接器 llvm-link 而不是 GNU ld 作为链接器的最佳方法是什么?配置项目时使用

CXX=clang++ cmake <args>

默认链接器似乎没有被触及,剩下的 usr/bin/ld(在 Linux 上)。

如果没有using a separate toolchain file,这可能吗?

【问题讨论】:

标签: linker cmake clang


【解决方案1】:

这与 CMake 无关:clang++ 默认使用系统链接器。例如,

echo "#include <atomic>\n int main() { return 0; }" \
    | clang++ -x c++ -std=c++11 -stdlib=libc++ -

使用/usr/bin/ld 链接应用程序。要将链接器更改为llvm-link,需要先发出LLVM字节码,然后调用链接器,例如:

echo "#include <atomic>\n int main() { return 0; }" \
    | clang++ -x c++ -std=c++11 -stdlib=libc++ -S -emit-llvm -o - - \
    | llvm-link -o binary -

这会绕过/usr/bin/ld

【讨论】:

  • 当您说“系统链接器”时,您是指它首先在您的$PATH 中找到的那个,还是硬编码到clang 中以使用/usr/bin/ 中的那个?
  • Clang 对链接器搜索路径 AFAIK 进行硬编码,并尝试在您的 $PATH 之外的其他地方获取 ld 二进制文件。我说“系统链接器”是指本机目标代码的标准链接器,而不是 LLVM 字节码链接器。
【解决方案2】:

从 3.4 开始,clang 在查找路径上的 ld 之前在 GCCInstallation.getParentLibPath() + "/../" + GCCInstallation.getTriple().str() + "/bin" 查找链接器 (ld)。您应该能够将链接器放入/usr/lib/gcc/&lt;arch&gt;&lt;sub&gt;-&lt;vendor&gt;-&lt;sys&gt;-&lt;abi&gt;/&lt;version&gt;/ld 并让clang 在第一步中调用它。要手动指定此位置,请使用 undocumented -B 标志。不幸的是,我不相信有办法改变所搜索的链接器的名称,因此使用 ld.gold 或 lld 需要在上述位置使用符号链接。

【讨论】:

    猜你喜欢
    • 2013-10-31
    • 1970-01-01
    • 2014-04-20
    • 2017-03-25
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    相关资源
    最近更新 更多