clang链接器问题

Ben*_*n04 10 c linker clang

我刚尝试了最新的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调用中注入必要的路径.有任何想法吗?

osg*_*sgx 3

好像是Clang版本无法检测主机的Linux版本和GCC版本...

\n

Clang 中的此代码必须添加 crt* 的路径:

\n

llvm \xe2\x86\x92 tools \xe2\x86\x92 clang \xe2\x86\x92 lib \xe2\x86\x92 Driver \xe2\x86\x92 Tools.cpp

\n
  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)\n

GetFilePath 将尝试在getFilePaths()当前 ToolChain 列表中搜索所要求的文件(文件clang/lib/Driver/ToolChains.cpp)。如果找不到文件,它将返回名称不变。

\n

  • 我已经成功地使用 SVN(版本 3.1SVN)的最新 clang 设置环境变量 COMPILER_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.4.4 。 (4认同)
  • 奇怪的是,我所实现的该函数与您引用的函数不同...但是添加 Paths.push_back("/usr/lib");Paths.push_back("/usr/lib/gcc/i486-linux-gnu/4.4 /”);成功了。如果我正确解释了我的代码,那么当 /usr/lib64 不存在时,它只会在 /usr/lib 中查找。但是该目录存在于我的系统上 (2认同)