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

Моя машина сборки xenial 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.

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

Является ли clang неправильным? Что я могу сделать, чтобы исправить это?

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

4 ответа

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

clang -v ...

, а также

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

, чтобы увидеть каталоги, которые ищет Кланг, поможет. Я нашел хакерское решение для Fedora. В настоящее время я делаю:

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

Установите кросс-компиляцию prereqs (зависит от дистрибутива, но Fedora имеет пакет файловой системы который создает папку <sysroot>). Это также включает все двоичные файлы и заголовки разработки для вашей целевой платформы. К сожалению, на многих платформах нет больших решений для этого. Например, Fedora не хватает libstdc++ для aarch64, но у IIRC Debian и Ubuntu есть это. Создайте sysroot для платформы mkdir -p <sysroot>/lib/gcc ln -s <sysroot>/include <sysroot>/usr/include # Another Clang quirk, it seems Скопируйте исполняемые файлы GCC и заголовки libstdc ++. Это то, что расстраивает, поскольку способ, которым Clang ищет установки GCC, - это поиск общих путей (например, /usr/lib/gcc/x86_64-linux-gnu) и увеличение количества каталогов X для поиска связанных заголовков. Это означает, что, если вы не можете создавать жесткие ссылки из ваших двоичных файлов gcc для вашего нового sys-root, вам нужно будет скопировать двоичные файлы и (некоторые) заголовки. Это то, что я должен был сделать, чтобы заставить это работать (это может быть для вас другое): 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 Добавить флаг --sysroot= в clang clang --target=arm-linux-gnueabihf --sysroot=<sysroot> ...

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

lib / Driver / Toolchains / Gnu.cpp

Библиотека / Driver / компилированные инструменты / Gnu.cpp

0
ответ дан 18 July 2018 в 08:14

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

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

0
ответ дан 18 July 2018 в 08:14

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

clang -v ...

, а также

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

, чтобы увидеть каталоги, которые ищет Кланг, поможет. Я нашел хакерское решение для Fedora. В настоящее время я делаю:

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

Установите кросс-компиляцию prereqs (зависит от дистрибутива, но Fedora имеет пакет файловой системы который создает папку <sysroot>). Это также включает все двоичные файлы и заголовки разработки для вашей целевой платформы. К сожалению, на многих платформах нет больших решений для этого. Например, Fedora не хватает libstdc++ для aarch64, но у IIRC Debian и Ubuntu есть это. Создайте sysroot для платформы mkdir -p <sysroot>/lib/gcc ln -s <sysroot>/include <sysroot>/usr/include # Another Clang quirk, it seems Скопируйте исполняемые файлы GCC и заголовки libstdc ++. Это то, что расстраивает, поскольку способ, которым Clang ищет установки GCC, - это поиск общих путей (например, /usr/lib/gcc/x86_64-linux-gnu) и увеличение количества каталогов X для поиска связанных заголовков. Это означает, что, если вы не можете создавать жесткие ссылки из ваших двоичных файлов gcc для вашего нового sys-root, вам нужно будет скопировать двоичные файлы и (некоторые) заголовки. Это то, что я должен был сделать, чтобы заставить это работать (это может быть для вас другое): 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 Добавить флаг --sysroot= в clang clang --target=arm-linux-gnueabihf --sysroot=<sysroot> ...

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

lib / Driver / Toolchains / Gnu.cpp

Библиотека / Driver / компилированные инструменты / Gnu.cpp

0
ответ дан 24 July 2018 в 19:02
  • 1
    Спасибо, просто увидел этот ответ. Я не совсем понимаю, почему ваш многоступенчатый процесс копирования двоичных файлов и заголовков необходим по сравнению с моим обходным решением -nostdinc++ -cxx-isystem=.... Вы просто описываете другую ситуацию в другом дистрибутиве? – Lack 6 May 2018 в 00:35
  • 2
    Я пытаюсь использовать --sysroot в отличие от -nostdinc++, потому что я не уверен, что последний автоматически выберет правильный двоичный код C ++. Я сказал, что моя работа была взломом, поэтому я не могу защитить свой подход намного дальше этого. – Daniel Wright 7 May 2018 в 01:45

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

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

0
ответ дан 24 July 2018 в 19:02

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

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