10

最新のllvmおよびclangトランクバージョンを試しました。彼らはすぐに警告なしでコンパイルしましたが、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 の呼び出しに必要なパスを挿入する方法もわかりません。何か案は?

4

4 に答える 4

3

ホストの Linux バージョンと gcc バージョンを検出できない clang バージョンのようです。

crt* へのパスを追加する必要がある clang のこのコード: 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")));

getFilePaths()GetFilePath は、現在の ToolChain のリスト (file ) で要求されたファイルを検索しようとしますclang/lib/Driver/ToolChains.cpp。ファイルが見つからない場合は、Name を変更せずに返します。

uname -aubuntu のバージョン ( 、cat /etc/lsb-release)、clang と llvm の正確なリリース (svn リビジョン番号)、およびgcc -v出力を教えてください。

于 2010-11-11T23:36:54.793 に答える
1

最新の (3.5) リリースでは、--with-gcc-toolchaingcc 4.7 より前の libstdc++ ライブラリがインストールされているシステムで configure オプションを使用してビルドを行うと、この種の問題が再び発生します。

次の 2 つのフレーバーがあります。

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

...さまざまなcrtファイルを見つけようとしていないだけでなく。

どちらの場合も、問題が修正されるまで、次の方法で問題を回避できます。

printf '#include <string>\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
于 2014-10-03T22:46:14.443 に答える
1

この恐ろしいハックは、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<const char *> 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);
     }
于 2011-10-22T14:22:43.123 に答える
0

走る:

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
于 2012-01-23T17:11:07.467 に答える