clang链接器问题

我刚尝试了最新的llvm和clang trunk版本。 他们编译时没有开箱即用的单一警告,但我在连接一个hello world示例时遇到了问题。 我的代码是

#include  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调用中注入必要的路径。 有任何想法吗?

似乎是clang版本,无法检测主机的linux版本和gcc版本..

这个代码在clang中必须添加路径到crt *: llvm›tools›clang›lib›Driver›Tools.cpp

  CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 

并且GetFilePath将尝试在当前ToolChain的getFilePaths()列表中搜索询问的文件(文件clang/lib/Driver/ToolChains.cpp )。 如果找不到文件,它将返回Name不变。

请给我你的ubuntu版本( uname -acat /etc/lsb-release ),clang和llvm的确切版本(svn版本号)和gcc -v输出

这个可怕的HACK“修复”在Ubuntu 11.10(x86)上编译/链接clang 3.0(r142716)

在/usr/include/stdio.h:28中包含的文件中:
/usr/include/features.h:323:10:致命错误:找不到’bits / predefs.h’文件

/ usr / bin / ld:找不到crt1.o:没有这样的文件或目录
/ usr / bin / ld:找不到crti.o:没有这样的文件或目录

 diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 75300b5..3e2be30 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -241,6 +241,7 @@ Compilation *Driver::BuildCompilation(ArrayRef ArgList) { // FIXME: Handle environment options which affect driver behavior, somewhere // (client?). GCC_EXEC_PREFIX, LIBRARY_PATH, LPATH, CC_PRINT_OPTIONS. + PrefixDirs.push_back("/usr/lib/i386-linux-gnu"); if (char *env = ::getenv("COMPILER_PATH")) { StringRef CompilerPath = env; while (!CompilerPath.empty()) { diff --git a/lib/Frontend/InitHeaderSearch.cpp b/lib/Frontend/InitHeaderSearch.cpp index b066e71..c6ffee8 100644 --- a/lib/Frontend/InitHeaderSearch.cpp +++ b/lib/Frontend/InitHeaderSearch.cpp @@ -562,10 +562,12 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple, AddPath("/usr/include/x86_64-linux-gnu", System, false, false, false); AddPath("/usr/include/i686-linux-gnu/64", System, false, false, false); AddPath("/usr/include/i486-linux-gnu/64", System, false, false, false); + AddPath("/usr/include/i386-linux-gnu/64", System, false, false, false); } else if (triple.getArch() == llvm::Triple::x86) { AddPath("/usr/include/x86_64-linux-gnu/32", System, false, false, false); AddPath("/usr/include/i686-linux-gnu", System, false, false, false); AddPath("/usr/include/i486-linux-gnu", System, false, false, false); + AddPath("/usr/include/i386-linux-gnu", System, false, false, false); } else if (triple.getArch() == llvm::Triple::arm) { AddPath("/usr/include/arm-linux-gnueabi", System, false, false, false); } 

在最近的(3.5)版本中,对于在安装了pre-gcc 4.7 libstdc ++库的系统上使用--with-gcc-toolchain configure选项进行构建的任何人,再次出现了这种问题。

你会看到它有两种forms:

 echo '#include ' | clang++ -xc++ - :1:10: fatal error: 'string' file not found #include  ^ 1 error generated. 

…以及不会找到各种crt文件。

在这两种情况下,以下内容允许您解决问题,直到它被修复:

 printf '#include \nint main( int argc, char *argv[] ) { return 0; }' > /tmp/blah.cc # Fixes issue not finding C++ headers; note that it must be gcc >= 4.7 clang++ --gcc-toolchain=/path/to/gcc/install -c -o /tmp/blah.o /tmp/blah.cc # Fixes the link error clang++ --gcc-toolchain=/path/to/gcc/install /tmp/blah.o /tmp/blah 

跑:

 clang -v 

在我的示例输出中:

 clang version 3.0 (tags/RELEASE_30/final) Target: armv7l-unknown-linux-gnueabi Thread model: posix 

以root身份运行以下命令以使用目标将缺少的目录创建为链接:

 ln -s /lib/arm-linux-gnueabi /lib/armv7l-unknown-linux-gnueabi ln -s /usr/lib/arm-linux-gnueabi /usr/lib/armv7l-unknown-linux-gnueabi ldconfig