我刚刚试用了最新的 llvm 和 clang trunk 版本。他们编译时没有一个开箱即用的警告,但我在链接一个 hello world 示例时遇到了麻烦。我的代码是
#include <stdio.h>
int main(){
printf("hello\n");
}
如果我编译使用
clang test.c
我收到以下错误
/usr/bin/ld: crt1.o: No such file: No such file or directory
clang: error: linker command failed with exit code 1 (use -v to see invocation)
使用 -v 表明 gnu ld 被调用为
"/usr/bin/ld" --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o a.out crt1.o crti.o crtbegin.o -L -L/../../.. /tmp/cc-0XJTsG.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed crtend.o crtn.o
但我有 crt1.o 目标文件!
$ locate crt1.o
/usr/lib/Mcrt1.o
/usr/lib/Scrt1.o
/usr/lib/crt1.o
/usr/lib/gcrt1.o
同样有效的是
clang -c test.c
gcc test.o
而且当然
gcc test.c
我进一步尝试:
$ clang -Xlinker "-L /usr/lib" test.c
/usr/bin/ld: crt1.o: No such file: No such file or directory
clang: error: linker command failed with exit code 1 (use -v to see invocation)
$ clang -Xlinker "-L /usr/lib" test.c -v
"/usr/bin/ld" --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o a.out crt1.o crti.o crtbegin.o -L -L/../../.. -L /usr/lib /tmp/cc-YsI9ES.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed crtend.o
我还尝试将 crt1.o 文件复制到当前目录中。这似乎奏效了。好吧,它没有编译,因为在那之后 crti.o 丢失了。
我的发行版是 Ubuntu。
好吧,我真的不知道下一步该尝试什么。我不知道如何修复 clang,也不知道如何在 ld 调用中注入必要的路径。有任何想法吗?