【发布时间】: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,这可能吗?
【问题讨论】:
告诉 CMake 使用 LLVM 链接器 llvm-link 而不是 GNU ld 作为链接器的最佳方法是什么?配置项目时使用
CXX=clang++ cmake <args>
默认链接器似乎没有被触及,剩下的 usr/bin/ld(在 Linux 上)。
如果没有using a separate toolchain file,这可能吗?
【问题讨论】:
这与 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/ 中的那个?
$PATH 之外的其他地方获取 ld 二进制文件。我说“系统链接器”是指本机目标代码的标准链接器,而不是 LLVM 字节码链接器。
从 3.4 开始,clang 在查找路径上的 ld 之前在 GCCInstallation.getParentLibPath() + "/../" + GCCInstallation.getTriple().str() + "/bin" 查找链接器 (ld)。您应该能够将链接器放入/usr/lib/gcc/<arch><sub>-<vendor>-<sys>-<abi>/<version>/ld 并让clang 在第一步中调用它。要手动指定此位置,请使用 undocumented -B 标志。不幸的是,我不相信有办法改变所搜索的链接器的名称,因此使用 ld.gold 或 lld 需要在上述位置使用符号链接。
【讨论】: