Компилирую QT5.12.3 под устройство armbian. Для конфигурации (./configure) использую следующие опции:
./configure -prefix /home/asianirish/Install/qt5/qtbase -opensource -confirm-license \
-debug \
-prefix /home/asianirish/Qt-custom/qt-embedded-5.12.3 \
-sysroot /home/asianirish/img/armbian \
-c++std c++11 \
-device linux-arm-generic-g++ \
-device-option CROSS_COMPILE=/usr/bin/arm-linux-gnueabihf- \
-openssl \
-no-widgets \
-no-gif -qt-libpng -qt-libjpeg \
-no-opengl \
-skip qtwebengine \
-nomake examples \
-v
Конфигурация заканчивается успехом:
/*
Note: Also available for Linux: linux-clang linux-icc
Note: No wayland-egl support detected. Cross-toolkit compatibility disabled.
WARNING: QDoc will not be compiled, probably because libclang could not be located. This means that you cannot build the Qt documentation.
Either ensure that llvm-config is in your PATH environment variable, or set LLVM_INSTALL_DIR to the location of your llvm installation.
On Linux systems, you may be able to install libclang by installing the libclang-dev or libclang-devel package, depending on your distribution.
On macOS, you can use Homebrew's llvm package.
On Windows, you must set LLVM_INSTALL_DIR to the installation path.
Qt is now configured for building. Just run 'make'.
Once everything is built, you must run 'make install'.
Qt will be installed into '/home/asianirish/img/armbian/home/asianirish/Qt-custom/qt-embedded-5.12.3'.
Prior to reconfiguration, make sure you remove any leftovers from
the previous build.
*/
Но, после выполнения make выдает ошибку:
...
In file included from kernel/qdnslookup_unix.cpp:59:0:
/usr/arm-linux-gnueabihf/include/gnu/lib-names.h:8:33: fatal error: gnu/lib-names-soft.h: No such file or directory
compilation terminated.
Makefile:20940: recipe for target '.obj/qdnslookup_unix.o' failed
make[3]: *** [.obj/qdnslookup_unix.o] Error 1
make[3]: Leaving directory '/home/asianirish/Install/qt5/qtbase/src/network'
Makefile:273: recipe for target 'sub-network-make_first' failed
make[2]: *** [sub-network-make_first] Error 2
make[2]: Leaving directory '/home/asianirish/Install/qt5/qtbase/src'
Makefile:50: recipe for target 'sub-src-make_first' failed
make[1]: *** [sub-src-make_first] Error 2
make[1]: Leaving directory '/home/asianirish/Install/qt5/qtbase'
Makefile:89: recipe for target 'module-qtbase-make_first' failed
make: *** [module-qtbase-make_first] Error 2
Захожу в /usr/arm-linux-gnueabihf/include/gnu/ и точно, там лежит только lib-names-hard.h, никакого lib-names-soft.h там нет!
>pwd
/usr/arm-linux-gnueabihf/include/gnu
>ls
libc-version.h lib-names-hard.h stubs-hard.h
lib-names.h stubs.h stubs-soft.h
И что это за lib-names-soft.h такой? Лезу в lib-names.h и вижу:
#if !defined __ARM_PCS_VFP
# include <gnu/lib-names-soft.h>
#endif
#if defined __ARM_PCS_VFP
# include <gnu/lib-names-hard.h>
#endif
Гуглю __ARM_PCS_VFP и выясняю, что это способ использования чисел с плавающей точкой - хардверовый или софтверовый. Ну окей, решаюсь на грязный хак - добавляю в файл linux_device_post.conf (из опенсорсного пакета QT) строку:
#Внимание, грязный хак, не повторяйте!
QMAKE_CFLAGS += -mfloat-abi=hard
Но, как и ожидалось - фэйл:
/*
collect2: error: ld returned 1 exit status
Makefile:1230: recipe for target '../../lib/libQt5Core.so.5.12.3' failed
make[3]: *** [../../lib/libQt5Core.so.5.12.3] Error 1
make[3]: Leaving directory '/home/asianirish/Install/qt5/qtbase/src/corelib'
Makefile:223: recipe for target 'sub-corelib-make_first' failed
make[2]: *** [sub-corelib-make_first] Error 2
make[2]: Leaving directory '/home/asianirish/Install/qt5/qtbase/src'
Makefile:50: recipe for target 'sub-src-make_first' failed
make[1]: *** [sub-src-make_first] Error 2
make[1]: Leaving directory '/home/asianirish/Install/qt5/qtbase'
Makefile:89: recipe for target 'module-qtbase-make_first' failed
make: *** [module-qtbase-make_first] Error 2
*/
Кто-нибудь сталкивался с такой проблемой? Где взять этот lib-names-soft.h? Я думаю, подсунуть его будет еще более грязным хаком, так что не буду и пытаться. Может в конфигурации изменить -device-option? Или -device? На что? Куда копать?
Где взять этот lib-names-soft.h?
Для arm'а выбор, используется ли ABI с железной математикой или с софтверной определяется на этапе сборки тулчейна (gcc+binutils+libc). Собственно hf в кортеже компилятора arm-linux-gnueabihf говорит о том, что этот тулчейн был собран, чтобы производить на выходе бинарники с одноимённым ABI.
Если целевая система представляет собой softfloat систему, то нужно найти/собрать другой тулчейн; lib-names-soft.h будет там из коробки.
Может в конфигурации изменить -device-option?
Да, это будет верным решением:
-device-option DISTRO_OPTS=hard-float
добавляю в файл linux_device_post.conf (из опенсорсного пакета QT) строку
В принципе этого должно было бы хватить... Возможно, просто забыл очистить каталог сборки перед пересборкой? Или забыл изменить CXXFLAGS?
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости