LINUX.ORG.RU

Не могу собрать Qt для кросс-компиляции

 ,


0

1

Хочу написать приложение, которое будет работать на 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. Но, как я понимаю, мне всё равно для своей разработки надо собирать локально версию для кросс-компиляции.

★★★

Чё то по моему не туда…

Во первых, у вас там для голого железа сборка идёт или под ось на этом железе?

Если первое, то лол удачи братан без комментариев.

Всли второе, то сабж не ясен. Чё за армдевайс, контроллер, миникомпьютер?

Второе что я вижу, там наверняка нужна видеокарта, и оно требует опенжл для сборки, плюс нужен дисплейный сервер что бы это вообще работало.

А если у вас вообще мироконтроллер с экранчиком, то нужно свою либу писать

nikitalol
()

Для сборки так или иначе потребуются заголовочные файлы и файлы для линковки. При чём тех же версий. И пытаться что-то подсунуть с хостовой системы такой себе вариант. Мало того,что какие-то заголовочные файлы могут быть сгенерированны, так ещё и библиотеки для линковки надо где-то взять?

Тут либо собирать всё ручками (т.е. все зависимости), либо взять Yocto Linux (или что ещё там использовалось для сборки образа) и автоматизировать процесс сборки.

AlexVR ★★★★★
()

Нужно собирать под плафторму linuxfb

Как я понимаю, суть ошибки в том, что компилятор не соответствует плате.

Скорее всего так и есть, от компилятора с название arm-linux-gnueabi-gcc я бы ожидал 32-битность, 64-битный должен начинаться с aarch64 (или, в крайнем случае, arm64). А библиотека 64-битная.

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от nikitalol

Во первых, у вас там для голого железа сборка идёт или под ось на этом железе?

Под ось.

Всли второе, то сабж не ясен. Чё за армдевайс, контроллер, миникомпьютер?

Вот эта плата: https://www.forlinx.net/product/imx8mm-single-board-computer-29.html

Второе что я вижу, там наверняка нужна видеокарта, и оно требует опенжл для сборки, плюс нужен дисплейный сервер что бы это вообще работало.

Там стартуют иксы. OpenGL есть, с хедерами пока не понял, но в usr/lib точно есть и так в примерах что-то есть.

vbr ★★★
() автор топика
Ответ на: комментарий от vbr

Теперь новая ошибка

+ mkdir -p qtbase
+ cd qtbase
+ exec /mnt/data/qt-everywhere-src-6.4.3/qtbase/configure -top-level -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
'/usr/bin/cmake' '-DQT_HOST_PATH=/mnt/data/qt-host' '-DQT_BUILD_SUBMODULES=qtbase' '-DCMAKE_TOOLCHAIN_FILE=/home/build/imx8mm.cmake' '-DCMAKE_INSTALL_PREFIX=/opt/qt' '-DCMAKE_STAGING_PREFIX=/mnt/data/qt-embedded' '-DQT_BUILD_EXAMPLES=FALSE' '-DQT_BUILD_TESTS=FALSE' '-DINPUT_sysroot=/mnt/data/rootfs-ok8mm' '-G' 'Ninja' '/mnt/data/qt-everywhere-src-6.4.3'
-- The CXX compiler identification is GNU 10.2.1
-- The C compiler identification is GNU 10.2.1
-- The ASM compiler identification is GNU
-- Found assembler: /usr/bin/aarch64-linux-gnu-gcc
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/aarch64-linux-gnu-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/aarch64-linux-gnu-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
Checking dependencies of submodule 'qtbase'
Configuring submodule 'qtbase'
CMake Error at qtbase/cmake/QtSeparateDebugInfo.cmake:62 (message):
  Extracted binary path for strip does not exist: Change Dir:
  /mnt/data/qt-embedded-build/qtbase/config.tests/binary_for_strip_built


  Run Build Command(s):/usr/bin/ninja && [0/1] Re-running CMake...

  -- The CXX compiler identification is GNU 10.2.1

  -- Detecting CXX compiler ABI info

  -- Detecting CXX compiler ABI info - done

  -- Check for working CXX compiler: /usr/bin/aarch64-linux-gnu-g++ - skipped

  -- Detecting CXX compile features

  -- Detecting CXX compile features - done

  -- Configuring done

  -- Generating done

  -- Build files have been written to:
  /mnt/data/qt-embedded-build/qtbase/config.tests/binary_for_strip_built

  [0/1] Re-running CMake...

  -- Configuring done

  -- Generating done

  -- Build files have been written to:
  /mnt/data/qt-embedded-build/qtbase/config.tests/binary_for_strip_built

  [0/1] Re-running CMake...

  -- Configuring done

  -- Generating done

  -- Build files have been written to:
  /mnt/data/qt-embedded-build/qtbase/config.tests/binary_for_strip_built

...

  [0/1] Re-running CMake...

  -- Configuring done

  -- Generating done

  -- Build files have been written to:
  /mnt/data/qt-embedded-build/qtbase/config.tests/binary_for_strip_built

  ninja: error: manifest 'build.ninja' still dirty after 100 tries

  

  

Call Stack (most recent call first):
  qtbase/cmake/QtSeparateDebugInfo.cmake:111 (qt_internal_try_compile_binary_for_strip)
  qtbase/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake:402 (qt_internal_generate_binary_strip_wrapper)
  qtbase/CMakeLists.txt:109 (qt_build_repo_begin)


-- Configuring incomplete, errors occurred!
See also "/mnt/data/qt-embedded-build/CMakeFiles/CMakeOutput.log".
CMake Error at /mnt/data/qt-everywhere-src-6.4.3/qtbase/cmake/QtProcessConfigureArgs.cmake:965 (message):
  CMake exited with code 1.

Что-ж оно непонятно так падает-то…

vbr ★★★
() автор топика

Про сборку qt ничего не расскажу, но имхо брать за основу кривой/косой и главное древний и не поддерживаемый rootfs и пытаться с ним жить так себе идея.

Я бы на твоём месте взял нормальный aarch64 дистрибутив, типа того же almalinux 9. Ну или armbian, миллион их, в общем-то.

И уже для этого дистра можно собрать какой нужно rootfs с необходимыми компонентами, в том числе и qt. Загрузчик, ядро, какие-то правила udev и прочие вещи можно взять из оригинальной ОС, ну или собрать свежее, если плата поддерживается апстримом (но не обязательно).

И тогда тебе не нужно будет собирать что-либо, бери, да кросскомпилируй, например так.

Ivan_qrt ★★★★★
()
Ответ на: комментарий от kuzulis

Я бы взял Yocto

Дело говорит. Собирать самому Qt под arm, а тем более под arm64 тот еще гемор. Бери Yocto готовые рецепты под похожую плату, главное что архитектура подходила. Он тебе и rootfs соберет и компилятор aarch64 и sdk. А ядро и device tree можно и отдельно вручную собрать.

guskov_roman
()
Ответ на: комментарий от guskov_roman

Я неделю пытался собрать, не получилось. Без графики собралось, графика не стартует. Ни с моим ядром, ни с ихним. Собирать буду по-любому, но пока нужно прототип, не хочу на это ещё больше времени тратить, тем более, что я там пока не понимаю, что дальше делать, а потом знающие люди, надеюсь, вместо меня сделают всё по уму.

Пока решил попробовать использовать Qt той версии, которая стоит у них в sysroot-е. 5-летней давности, ну что поделаешь.

vbr ★★★
() автор топика
Ответ на: комментарий от vbr

В общем в итоге взял 9 дебиан (на более новых Qt не собирается). Собрал там Qt. Кросс-компиляцию настроить так и не получилось, в сисруте не хватает заголовочных файлов, а как брать заголовочные файлы с хоста, я не понял. Поэтому тупо скомпилил без всяких кросс, благо на хосте у меня тоже aarch64 и libc даже старей. И всё заработало, по крайней мере на хелло-ворлде с одной кнопкой. Пока буду двигаться этим путём. Порнография, а что поделать.

vbr ★★★
() автор топика
Ответ на: комментарий от guskov_roman

Собирать самому Qt под arm, а тем более под arm64 тот еще гемор

я вас умоляю ;) и под arm, hard и soft-float, и под mipsel, и даже под sh4

в Qt6 они конечно «удружили», Qt4 и Qt5 собирались конечно проще

imb ★★
()
Ответ на: комментарий от imb

Я тоже все это собирал и под разные imx и под arm и под arm64. Собрать то не трудно, главный гемор там заставить работать графику. В итоге время тратишь больше, что просто взять yocto который тебе все соберет.

guskov_roman
()