Моя машина сборки 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 неправильным? Что я могу сделать, чтобы исправить это?
В этом случае вы можете использовать --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
Я все еще не знаю, что не так с clang и / или моей конфигурацией системы, но я использовал эти флаги в качестве обходного пути:
-nostdinc++ -cxx-isystem /usr/arm-linux-gnueabihf/include/c++/5 -cxx-isystem /usr/arm-linux-gnueabihf/include/c++/5/arm-linux-gnueabihf
В этом случае вы можете использовать --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
Я все еще не знаю, что не так с clang и / или моей конфигурацией системы, но я использовал эти флаги в качестве обходного пути:
-nostdinc++ -cxx-isystem /usr/arm-linux-gnueabihf/include/c++/5 -cxx-isystem /usr/arm-linux-gnueabihf/include/c++/5/arm-linux-gnueabihf