проблема компоновщика clang
Я только что опробовал последние версии LLVM и Clang trunk. Они скомпилированы без единого предупреждения из коробки, но у меня возникли проблемы с связыванием примера hello world. Мой код
#include <stdio.h>
int main(){
printf("hellon");
}
если я компилирую с помощью
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
что также работает is
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.о пропала.
мой дистрибутив Ubuntu.
Ну я не знаю, что предпринять. Я не вижу, как я мог бы исправить clang, и у меня нет идеи о том, как ввести необходимый путь в вызов ld. Любой идеи?
4 ответов
кажется, версия 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 попытается найти запрошенные файлы в getFilePaths()
список текущей цепочки инструментов (file clang/lib/Driver/ToolChains.cpp
). Если он не может найти файл, он вернет имя без изменений.
пожалуйста, дайте мне версию вашего ubuntu (uname -a
, cat /etc/lsb-release
), точный выпуск (номер редакции svn) clang и llvm, и gcc -v
выход
этот ужасный Хак "исправляет" компиляцию / связывание с clang 3.0 (r142716) на Ubuntu 11.10 (x86)
в файле, включенном из /usr/include / stdio.h: 28:
в /usr/включать/особенности.h: 323: 10: фатальная ошибка: 'bits / predefs.H-файл не найден
/ usr/bin / ld: не удается найти crt1.О: нет такого файла или каталога
/ 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);
}
В последнем выпуске (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
run:
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