Проблема с lib-names-soft.h при кросскомпиляции QT под armbian

181
08 января 2022, 06:00

Компилирую 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? На что? Куда копать?

Answer 1

Где взять этот 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?

READ ALSO
C++ Применение cin.getline к двумерным массивам char

C++ Применение cin.getline к двумерным массивам char

Вопрос таков - какие есть решения?

145
Почему нет доступа к полям MyIterator?

Почему нет доступа к полям MyIterator?

Я пишу вторую версию вставки в map, где нужно передавать ещё и итератор, помимо вставляемой пары, то есть пишу аналог такой вставки:

195
Башня || Олимпиада ACM-ICPC

Башня || Олимпиада ACM-ICPC

Есть вопрос к задаче по алгоритмическому программированию:

218
(C++) Самоудаление dll возможно?

(C++) Самоудаление dll возможно?

Возможно ли сделать самоудаление dll при возвращении DLL_PROCESS_DETACH?

171