LLD - 未知参数:-arch。

11

试图在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
@bogardon 是的。我联系了Clang邮件列表。 目前在macOS上LLD(即Mach-O对象格式)的工作已经停滞不前。 现在最好的方法是继续使用系统链接器(我相信它被称为ld64)。 - juniel_katarn
2个回答

1
在联系LLVM-dev邮件列表后,似乎macOS上的LLD(即Mach-O对象格式链接)开发已经停滞不前。
在macOS上使用Clang,最好使用操作系统提供的ld64

ld64和/usr/bin/ld是一样的吗?我想使用lld来加快链接时间。我猜现在还不可能吗? - bogardon
1
是的,我认为它们实际上可能是符号链接。 注意,在 macOS 上可以使用 LLD,但是:
  1. 在 macOS 上,自动链接的“绑定”(clang -fuse-ld = lld)在编译后破损了。您需要仅编译,然后在单独的命令中进行链接。
  2. 根据 LLVM dev 列表,链接器本身处于预-alpha质量阶段,因此目前仅适用于实验性工作。
- juniel_katarn

1
如果使用LLVM-lld的唯一原因是速度,那么请尝试使用zld。 它的速度通常是Apple-ld所需时间的一半(甚至更少)。
添加以下链接器标志:
-fuse-ld=`which zld` -Wl,-zld_original_ld_path,ld 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接