2010-11-11 7 views
10

Я только что опробовал последние версии llvm и clang trunk. Они скомпилированы без единого предупреждения из коробки, но у меня возникли проблемы с привязкой к приветствующему миру примеру. Мой кодпроблема с линком clang

#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 показывает, что гну л.д. вызывается как

"/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. Есть идеи?

+0

У меня есть только краткое описание -Xlinker на странице моего звоном, но не -Xlinker должен быть дважды передается для опций с аргументами? Это то, что говорится в man-страницах gcc для -Xlinker. – anddam

ответ

3

Кажется, лязг версии, которая не может обнаружить хозяин версию Linux и GCC версии ..

Этого код в звоне, который должен добавить путь к КРТУ *: 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 попытается найти запрошенные файлы в getFilePaths() списке текущего ToolChain (файл clang/lib/Driver/ToolChains.cpp). Если он не может найти файл, он вернет имя без изменений.

Пожалуйста, дайте мне версию вашего убунту (uname -a, cat /etc/lsb-release), точный релиз (SVN номер ревизии) лязг и LLVM и gcc -v выхода

+2

Любопытно, что реализация этой функции у меня отличается от той, которую вы указали ... Однако добавление Paths.push_back ("/ usr/lib"); Paths.push_back ("/ usr/lib/gcc/i486-linux-gnu/4.4/"); сделал трюк. Если я интерпретирую код, который у меня есть правильно, он выглядит только в/usr/lib, когда/usr/lib64 не существует. Однако этот каталог существует в моей системе – Ben04

+0

, там была очень старая цитата. теперь я получаю http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ и могу проверить код для вашей комбинации clang rev, ubuntu и gcc версии – osgx

+0

Код 'GetFilePath()' trys , чтобы открыть файл (crt1.o) в каждом каталоге в списке 'getFilePaths()'. Он остановится, если есть файл где-нибудь или он вернет имя файла без пути – osgx

1

Этого ужасный HACK "исправление" компиляцию/связывающую с лязгом 3.0 (r142716) на Ubuntu 11.10 (x86)

В файле включены из /usr/include/stdio.h:28:
/usr/include/features.h:323:10: фатальная ошибка: «бит/predefs. h 'файл не найден

/usr/bin/ld: не найдено crt1.o: Нет таких файл или каталог
/usr/bin/ld: не найти crti.Не о: Нет такого файла или каталога

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); 
    } 
+1

Этот патч больше не нужен с r143344, r143345, r143346. Проблема должна быть исправлена. см. Http://llvm.org/bugs/show_bug.cgi?id=11223 – Peter

0

пробег:

clang -v 

В моем примере выходе:

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

Выполните следующие действия, как корень, чтобы использовать цель создать отсутствующий каталог, ссылка:

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 
1

В самом последнем выпуске (3.5) эта проблема возникла снова для всех, кто делает сборку, используя опцию конфигурации --with-gcc-toolchain в системе с установленной ранее установленной библиотекой libstdC++ pre-gcc 4.7.

Вы увидите его в двух вариантах:

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