problème de lieur clang

Je viens d’essayer les dernières versions de llvm et de clang trunk. Ils ont compilé sans avertissement, mais j’ai du mal à relier un exemple Hello World. Mon code est

#include  int main(){ printf("hello\n"); } 

Si je comstack en utilisant

 clang test.c 

Je reçois l’erreur suivante

 /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) 

L’utilisation de -v montre que le gnu ld est appelé

 "/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 

Mais j’ai le fichier object crt1.o!

 $ locate crt1.o /usr/lib/Mcrt1.o /usr/lib/Scrt1.o /usr/lib/crt1.o /usr/lib/gcrt1.o 

Ce qui fonctionne aussi est

 clang -c test.c gcc test.o 

et bien sur

 gcc test.c 

Ce que j’ai encore essayé:

 $ 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 

J’ai également essayé de copier le fichier crt1.o dans le répertoire en cours. Cela a semblé fonctionner. Eh bien, il n’a pas été compilé car après cela, crti.o a disparu

Ma dissortingbution est Ubuntu.

Eh bien, je ne sais pas vraiment quoi essayer ensuite. Je ne vois pas comment je pourrais réparer clang ni comment injecter le chemin nécessaire dans l’invocation ld. Des idées?

Semble être une version clang qui ne peut pas détecter la version linux de l’hôte ni la version gcc.

Ce code dans clang qui doit append le chemin d’access à crt *: llvm›tools›clang›lib›Driver›Tools.cpp

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

et GetFilePath essaiera de rechercher les fichiers demandés dans la liste getFilePaths() de la ToolChain actuelle (fichier clang/lib/Driver/ToolChains.cpp ). S’il ne parvient pas à trouver un fichier, le nom restra inchangé.

S’il vous plaît, donnez-moi la version de votre ubuntu ( uname -a , cat /etc/lsb-release ), la version exacte (numéro de révision svn) de clang et llvm et la sortie gcc -v

Cet horrible HACK “corrige” la compilation / liaison avec Clang 3.0 (r142716) sur Ubuntu 11.10 (x86)

Dans le fichier inclus à partir de /usr/include/stdio.h:28:
/usr/include/features.h:323:10: erreur fatale: fichier ‘bits / predefs.h’ introuvable

/ usr / bin / ld: impossible de trouver crt1.o: aucun fichier ou répertoire de ce type
/ usr / bin / ld: impossible de trouver crti.o: aucun fichier ou répertoire de ce type

 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")) { SsortingngRef ComstackrPath = env; while (!ComstackrPath.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 &sortingple, 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 (sortingple.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 (sortingple.getArch() == llvm::Triple::arm) { AddPath("/usr/include/arm-linux-gnueabi", System, false, false, false); } 

Dans la version la plus récente (3.5), ce type de problème est apparu de nouveau pour tous ceux qui construisent à l’aide de l’option de configuration --with-gcc-toolchain sur un système disposant d’une bibliothèque libstdc ++ antérieure à 4.7 gcc.

Vous le verrez en deux saveurs:

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

… ainsi que de ne pas être sur le sharepoint trouver les différents fichiers crt.

Dans les deux cas, ce qui suit vous permet de contourner le problème jusqu’à ce qu’il soit résolu:

 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 

courir:

 clang -v 

Dans mon exemple, la sortie est:

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

Exécutez ce qui suit en tant que root pour utiliser la cible afin de créer un répertoire manquant sous forme de lien:

 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