我刚尝试了最新的llvm和clang trunk版本.他们在没有开箱即用的情况下编译,但是我在连接一个hello world示例时遇到了麻烦.我的代码是
#include <stdio.h>
int main(){
printf("hello\n");
}
Run Code Online (Sandbox Code Playgroud)
如果我编译使用
clang test.c
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
/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)
Run Code Online (Sandbox Code Playgroud)
使用-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
Run Code Online (Sandbox Code Playgroud)
但是我有crt1.o目标文件!
$ locate crt1.o
/usr/lib/Mcrt1.o
/usr/lib/Scrt1.o
/usr/lib/crt1.o
/usr/lib/gcrt1.o
Run Code Online (Sandbox Code Playgroud)
什么也有效
clang -c test.c
gcc test.o
Run Code Online (Sandbox Code Playgroud)
而且当然
gcc test.c
Run Code Online (Sandbox Code Playgroud)
我进一步尝试了什么:
$ 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
Run Code Online (Sandbox Code Playgroud)
我还尝试将crt1.o文件复制到当前目录中.这似乎有效.好吧它没有编译,因为之后crti.o丢失了.
我的发行版是Ubuntu.
好吧,我真的不知道下一步该尝试什么.我不知道如何修复clang,也不知道如何在ld调用中注入必要的路径.有任何想法吗?
好像是Clang版本无法检测主机的Linux版本和GCC版本...
\nClang 中的此代码必须添加 crt* 的路径:
\nllvm \xe2\x86\x92 tools \xe2\x86\x92 clang \xe2\x86\x92 lib \xe2\x86\x92 Driver \xe2\x86\x92 Tools.cpp
CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o")));\n CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));\n CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));\n
Run Code Online (Sandbox Code Playgroud)\nGetFilePath 将尝试在getFilePaths()
当前 ToolChain 列表中搜索所要求的文件(文件clang/lib/Driver/ToolChains.cpp
)。如果找不到文件,它将返回名称不变。
归档时间: |
|
查看次数: |
20729 次 |
最近记录: |