Компилирую 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
?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Я пишу вторую версию вставки в map, где нужно передавать ещё и итератор, помимо вставляемой пары, то есть пишу аналог такой вставки:
Возможно ли сделать самоудаление dll при возвращении DLL_PROCESS_DETACH?