Хочу написать приложение, которое будет работать на arm девайсе. Документации не нашёл, делаю по крохам информации, которую нашёл, но ничего не получилось.
Во-первых нужно собрать Qt для хоста.
Хост у меня дебиан. Ставлю пакеты cmake gcc g++ mesa-common-dev ninja-build perl
. Собираю командами
../qt-everywhere-src-6.4.3/configure -prefix /mnt/data/qt-host -submodules qtbase
cmake --build . --parallel 4
cmake --install .
Это у меня получилось.
Далее нужно собрать Qt для таргета. Таргет у меня это какая-то китайская плата с i.MX8MM. Есть rootfs для неё.
Первая проблема в том, что не понятно, где брать компилятор. Я поставил таким образом:
dpkg --add-architecture arm64
apt-get update
apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi
Также пробовал вариации с --add-architecture arm
и gnueabhf
. Не знаю, чем они отличаются и как понять, какой мне надо.
Далее написал файл imx8mm.cmake
со следующими строчками:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER arm-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabi-g++)
set(CMAKE_SYSROOT ${INPUT_sysroot})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
и пытаюсь сконфигурировать Qt командой
/mnt/data/qt-everywhere-src-6.4.3/configure \
-prefix /opt/qt \
-extprefix /mnt/data/qt-embedded \
-qt-host-path /mnt/data/qt-host \
-sysroot /mnt/data/rootfs-ok8mm \
-submodules qtbase \
-nomake examples -nomake tests \
-- \
-DCMAKE_TOOLCHAIN_FILE=/home/build/imx8mm.cmake
Это всё кончается ошибкой
ERROR: The OpenGL functionality tests failed! You might need to modify the OpenGL package search path by setting the OpenGL_DIR CMake variable to the OpenGL library's installation directory.
Я не знаю, где посмотреть точно какая ошибка ему помешала.
В файле CMakeError.log
есть миллион ошибок, но в том числе одна, которая мне кажется важной и которую я не знаю, как решить:
: && /usr/bin/arm-linux-gnueabi-gcc --sysroot=/mnt/data/rootfs-ok8mm -DCHECK_FUNCTION_EXISTS=XOpenDisplay -fPIE -pie CMakeFiles/cmTC_d6b57.dir/CheckFunctionExists.c.o -o cmTC_d6b57 /mnt/data/rootfs-ok8mm/usr/lib/libX11.so /mnt/data/rootfs-ok8mm/usr/lib/libXext.so /mnt/data/rootfs-ok8mm/usr/lib/libGLESv2.so /mnt/data/rootfs-ok8mm/usr/lib/libEGL.so && :
/mnt/data/rootfs-ok8mm/usr/lib/libX11.so: file not recognized: file format not recognized
collect2: error: ld returned 1 exit status
Как я понимаю, суть ошибки в том, что компилятор не соответствует плате.
Вот вывод readelf -a /mnt/data/rootfs-ok8mm/usr/lib/libX11.so.6.3.0
, может быть он чем-то поможет: https://pastebin.com/raw/5t5dQ2qw
Также ещё вижу такие проблемы: в usr/include платы нет заголовков для EGL, но при этом сами библиотеки в usr/lib есть. Пока до ошибок с EGL не дошёл, планировал их решить установкой пакета EGL в хостовую систему и изменением set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
на BOTH
, хотя не уверен, что это правильно.
Может быть я зря на Qt 6 это пытаюсь делать и лучше использовать Qt 5? На плате установлена Qt 5 и есть какие-то примеры на Qt 5. Но, как я понимаю, мне всё равно для своей разработки надо собирать локально версию для кросс-компиляции.