【问题标题】:LLD - unknown argument: -archLLD - 未知参数:-arch
【发布时间】:2017-10-21 17:24:46
【问题描述】:

尝试在 Mac OS Sierra 上使用 LLVM 4.0.0 版本(Clang、LLD)链接一个简单的程序。 请注意,这在 Linux 中完全可以实现。

我的当前路径以 LLVM 的 bin 目录为前缀(即 /opt/LLVM/4.0.0/bin:$PATH

程序 (main.cpp) 是最简单的 C++ 应用程序:

int main()
{
    return 0;
}

发出的shell命令是:clang -fuse-ld=lld.
失败并出现以下错误:

/opt/llvm/4/bin/ld.lld: error: unknown argument: -no_deduplicate
/opt/llvm/4/bin/ld.lld: error: unknown argument: -dynamic
/opt/llvm/4/bin/ld.lld: error: unknown argument: -arch
/opt/llvm/4/bin/ld.lld: error: unknown emulation: acosx_version_min
/opt/llvm/4/bin/ld.lld: error: unable to find library -lto_library
/opt/llvm/4/bin/ld.lld: error: /opt/llvm/4/lib/libLTO.dylib: invalid data encoding
clang-4.0: error: linker command failed with exit code 1 (use -v to see invocation)

使用-v 开关,我看到了这个链接器命令(格式化):

"/opt/llvm/4/bin/ld.lld" \
    -demangle \
    -lto_library /opt/llvm/4/lib/libLTO.dylib \
    -no_deduplicate \
    -dynamic \
    -arch x86_64 \
    -macosx_version_min 10.12.0 \
    -o a.out \
    main.o \
    -lSystem /opt/llvm/4/bin/../lib/clang/4.0.0/lib/darwin/libclang_rt.osx.a

有人知道这个平台的正确开关吗?

【问题讨论】:

  • 你有想过这个吗?
  • @bogardon 是的。我联系了 Clang 邮件列表。 macOS 的 LLD(意思是 Mach-O 对象格式)的工作已经过时。目前最好的方法是使用系统链接器(我相信它被称为ld64)。

标签: c++ macos linker llvm lld


【解决方案1】:

联系 LLVM-dev 邮件列表后,似乎 LLD for macOS(意思是,Mach-O 对象格式链接)开发已经过时了。

要在 macOS 上使用 Clang,最好坚持使用操作系统提供的 ld64

【讨论】:

  • ld64 和 /usr/bin/ld 一样吗?我想使用 lld 来缩短链接时间。我想这还不可能?
  • 是的,我认为它们实际上可能是符号链接的。请注意,您可以在 macOS 上使用 LLD,但是: 1. 编译后自动链接的“绑定”(clang -fuse-ld=lld)在 macOS 中被破坏。您只需要编译,然后在单独的命令中链接。 1. 根据 LLVM 开发人员列表,链接器本身处于 pre-alpha 质量,所以目前它仅用于实验性的东西。
【解决方案2】:

如果使用 LLVM-lld 的唯一原因是速度,那么试试 zld

与 Apple-ld 相比,它始终将时间减少一半(通常不到一半)。

添加以下链接器标志:

-fuse-ld=`which zld` -Wl,-zld_original_ld_path,ld 

【讨论】:

    猜你喜欢
    • 2022-09-25
    • 2017-06-01
    • 2022-01-22
    • 2016-12-15
    • 2015-06-07
    • 2014-06-09
    • 2011-09-20
    • 2021-11-17
    • 2021-03-10
    相关资源
    最近更新 更多