Неправильное значение по умолчанию включает каталоги для кросс-компиляции лязга?

Моя машина сборки является гостеприимным x86_64. Я кросс-компилирую для arm-linux-gnueabihf. Я установил g ++-arm-linux-gnueabihf.

При создании с clang++ --target=arm-linux-gnueabihf, Я получаю ошибку"/usr/bin/../lib/gcc-cross/arm-linux-gnueabihf/5.4.0/../../../../include/c++/5.4.0/string:38:10: fatal error: 'bits/c++config.h' file not found". Но почему это читает /usr/include/c++/5/string?

Используя команду, предложенную в "Дампе, включают пути от g ++", я проверяю включать пути на arm-linux-gnueabihf-g++:

$ /usr/bin/arm-linux-gnueabihf-g++ -E -x c++ - -v < /dev/null
Using built-in specs.
COLLECT_GCC=/usr/bin/arm-linux-gnueabihf-g++
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-armhf-cross/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-armhf-cross --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-armhf-cross --with-arch-directory=arm --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libgcj --enable-objc-gc --enable-multiarch --enable-multilib --disable-sjlj-exceptions --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb --disable-werror --enable-multilib --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- --includedir=/usr/arm-linux-gnueabihf/include
Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4) 
COLLECT_GCC_OPTIONS='-E' '-v' '-shared-libgcc' '-march=armv7-a' '-mfloat-abi=hard' '-mfpu=vfpv3-d16' '-mthumb' '-mtls-dialect=gnu'
 /usr/lib/gcc-cross/arm-linux-gnueabihf/5/cc1plus -E -quiet -v -imultiarch arm-linux-gnueabihf -D_GNU_SOURCE - -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -mthumb -mtls-dialect=gnu -fstack-protector-strong -Wformat -Wformat-security
ignoring nonexistent directory "/usr/local/include/arm-linux-gnueabihf"
ignoring nonexistent directory "/usr/include/arm-linux-gnueabihf"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc-cross/arm-linux-gnueabihf/5/../../../../arm-linux-gnueabihf/include/c++/5
 /usr/lib/gcc-cross/arm-linux-gnueabihf/5/../../../../arm-linux-gnueabihf/include/c++/5/arm-linux-gnueabihf
 /usr/lib/gcc-cross/arm-linux-gnueabihf/5/../../../../arm-linux-gnueabihf/include/c++/5/backward
 /usr/lib/gcc-cross/arm-linux-gnueabihf/5/include
 /usr/lib/gcc-cross/arm-linux-gnueabihf/5/include-fixed
 /usr/lib/gcc-cross/arm-linux-gnueabihf/5/../../../../arm-linux-gnueabihf/include
 /usr/include
End of search list.

Затем я проверяю включать пути на clang++-3.8 --target=arm-linux-gnueabihf:

$ /usr/bin/clang++-3.8 --target=arm-linux-gnueabihf -E -x c++ - -v < /dev/nullclang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
Target: arm--linux-gnueabihf
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc-cross/arm-linux-gnueabihf/5.4.0
Found candidate GCC installation: /usr/lib/gcc-cross/arm-linux-gnueabihf/5.4.0
Selected GCC installation: /usr/bin/../lib/gcc-cross/arm-linux-gnueabihf/5.4.0
Candidate multilib: .;@m32
Selected multilib: .;@m32
 "/usr/lib/llvm-3.8/bin/clang" -cc1 -triple armv6kz--linux-gnueabihf -E -disable-free -disable-llvm-verifier -main-file-name - -mrelocation-model static -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -fuse-init-array -target-cpu arm1176jzf-s -target-feature +strict-align -target-abi aapcs-linux -mfloat-abi hard -v -dwarf-column-info -debugger-tuning=gdb -resource-dir /usr/lib/llvm-3.8/bin/../lib/clang/3.8.0 -internal-isystem /usr/bin/../lib/gcc-cross/arm-linux-gnueabihf/5.4.0/../../../../include/c++/5.4.0 -internal-isystem /usr/bin/../lib/gcc-cross/arm-linux-gnueabihf/5.4.0/../../../../include/arm-linux-gnueabihf/c++/5.4.0 -internal-isystem /usr/bin/../lib/gcc-cross/arm-linux-gnueabihf/5.4.0/../../../../include/arm--linux-gnueabihf/c++/5.4.0 -internal-isystem /usr/bin/../lib/gcc-cross/arm-linux-gnueabihf/5.4.0/../../../../include/c++/5.4.0/backward -internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-3.8/bin/../lib/clang/3.8.0/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdeprecated-macro -fdebug-compilation-dir /home/leo/ws/odroid_ws -ferror-limit 19 -fmessage-length 157 -fallow-half-arguments-and-returns -fno-signed-char -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o - -x c++ -
clang -cc1 version 3.8.0 based upon LLVM 3.8.0 default target x86_64-pc-linux-gnu
ignoring nonexistent directory "/usr/bin/../lib/gcc-cross/arm-linux-gnueabihf/5.4.0/../../../../include/arm-linux-gnueabihf/c++/5.4.0"
ignoring nonexistent directory "/usr/bin/../lib/gcc-cross/arm-linux-gnueabihf/5.4.0/../../../../include/arm--linux-gnueabihf/c++/5.4.0"
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/bin/../lib/gcc-cross/arm-linux-gnueabihf/5.4.0/../../../../include/c++/5.4.0
 /usr/bin/../lib/gcc-cross/arm-linux-gnueabihf/5.4.0/../../../../include/c++/5.4.0/backward
 /usr/local/include
 /usr/lib/llvm-3.8/bin/../lib/clang/3.8.0/include
 /usr/include
End of search list.

Я замечаю (после того, как с помощью readlink для удаления путаницы../.. от путей):

arm-linux-gnueabihf-g++ использование/usr/arm-linux-gnueabihf/include/c ++/5, и не использует/usr/include/c ++/5.

clang++ --target=arm-linux-gnueabihf использование/usr/include/c ++/5, и не использует/usr/arm-linux-gnueabihf/include/c ++/5.

Лязг неправильно? Что я могу сделать для фиксации его?

3
задан 20 August 2017 в 07:04

2 ответа

Я все еще не знаю, что не так с clang и / или конфигурацией моей системы, но я использовал эти флаги в качестве обходного пути:

-nostdinc++ -cxx-isystem /usr/arm-linux-gnueabihf/include/c++/5 -cxx-isystem /usr/arm-linux-gnueabihf/include/c++/5/arm-linux-gnueabihf

0
ответ дан 1 December 2019 в 17:29

Можно использовать --sysroot=/usr/arm-linux-gnueabihf/sys-root в этом случае. Лязг, с 6,0 (невыпущенный ATM), кажется, работает вокруг многочисленных способов, которыми библиотеки GNU и инструменты (gcc, glibc, и libstdc ++ в особенности) размечаются на дистрибутивах Linux. У Вас могут все еще быть некоторые проблемы, который является где использование

clang -v ...

а также

strace -e 'trace=!write' clang ...

видеть каталоги Clang ищет, поможет. Я нашел hacky решение на Fedora. Я в настоящее время делаю:

(Я использую gcc 7 и лязг здесь, и <sysroot>=/usr/arm-linux-gnueabihf/sys-root)

  1. Установите кросс-компиляцию prereqs (варьируется дистрибутивом, но Fedora имеет пакет файловой системы, который создает <sysroot> папка). Это также включает все двоичные файлы и заголовки разработки для Вашей целевой платформы. К сожалению, там не являются большими из готовых решений для этого на многих платформах. Например, Fedora недостает libstdc++ для aarch64, но IIRC Debian и Ubuntu имеют это.

  2. Создайте sysroot для платформы

    mkdir -p <sysroot>/lib/gcc
    ln -s <sysroot>/include <sysroot>/usr/include # Another Clang quirk, it seems
    
  3. Скопируйте двоичные файлы GCC и libstdc ++ заголовки. Это - некоторые, что, разбивая, поскольку способ, которым Clang ищет установки GCC, путем поиска общих путей (например, /usr/lib/gcc/x86_64-linux-gnu) и повышаясь X количества каталогов для нахождения связанных заголовков. Это означает что, если Вы не можете создать жесткие ссылки от своих gcc двоичных файлов до Вашего нового sys-корня, что необходимо будет скопировать двоичные файлы и (немного) заголовки. Это - то, что я должен был сделать, чтобы заставить это работать (это может отличаться для Вас):

    cp -r /usr/lib/gcc/arm-linux-gnueabihf/ <sysroot>/lib/gcc
    # Fedora installs C++ headers here, but we will copy them into sys-root
    # Copy all of your other headers in the same manner
    cp -r /usr/arm-linux-gnueabihf/include/c++ <sysroot>/include
    
  4. Добавьте --sysroot= отметьте для лязга

    clang --target=arm-linux-gnueabihf --sysroot=<sysroot> ...
    

Большая часть логики в Лязге, который имеет дело с поиском этих каталогов, кажется, в этих файлах (они не могут существовать на более старых версиях Лязга):

lib/Driver/Toolchains/Gnu.cpp

lib/Driver/Toolchains/Linux.cpp

1
ответ дан 1 December 2019 в 17:29

Другие вопросы по тегам:

Похожие вопросы: