Рецепт по Кросскомпиляции Qt firefly

Все можно почерпнуть отсюда https://wiki.qt.io/Cross-Compile_Qt_6_for_Raspberry_Pi Установим Midnight Commander пригодится 100%
# mc
sudo apt install mc
Установка и настройка ssh
https://timeweb.cloud/tutorials/ubuntu/ustanovka-i-nastrojka-ssh-na-servere
# Установка и настройка ssh
 sudo apt install openssh-server
 sudo systemctl enable --now ssh
 sudo ufw allow ssh
На целевой машине
sudo apt-get install libboost-all-dev libudev-dev libinput-dev libts-dev libmtdev-dev libjpeg-dev libfontconfig1-dev libssl-dev libdbus-1-dev libglib2.0-dev libxkbcommon-dev libegl1-mesa-dev libgbm-dev libgles2-mesa-dev mesa-common-dev libasound2-dev libpulse-dev gstreamer1.0-omx libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev  gstreamer1.0-alsa libvpx-dev libsrtp2-dev libsnappy-dev libnss3-dev "^libxcb.*" flex bison libxslt-dev ruby gperf libbz2-dev libcups2-dev libatkmm-1.6-dev libxi6 libxcomposite1 libfreetype6-dev libicu-dev libsqlite3-dev libxslt1-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libx11-dev freetds-dev libsqlite3-dev libpq-dev libiodbc2-dev firebird-dev libgst-dev libxext-dev libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-sync1 libxcb-sync-dev libxcb-render-util0 libxcb-render-util0-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-glx0-dev libxi-dev libdrm-dev libxcb-xinerama0 libxcb-xinerama0-dev libatspi2.0-dev libxcursor-dev libxcomposite-dev libxdamage-dev libxss-dev libxtst-dev libpci-dev libcap-dev libxrandr-dev libdirectfb-dev libaudio-dev libxkbcommon-x11-dev
На хостовой машине
sudo apt-get install make build-essential libclang-dev ninja-build gcc git bison python3 gperf pkg-config libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libatspi2.0-dev libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev
 sudo apt install gcc make gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu
 sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
 sudo apt-get install libxcb*
 sudo apt install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
 sudo apt-get install build-essential libgl1-mesa-dev libxkbcommon-dev libwayland-dev libx11-dev
 sudo apt install cmake
Скачаем Исходники Qt
wget https://www.nic.funet.fi/pub/mirrors/download.qt-project.org/official_releases/qt/6.5/6.5.2/single/qt-everywhere-src-6.5.2.tar.xz
Распакуем
tar xfv qt-everywhere-src-6.5.2.tar.xz
Соберем Qt для хостовой машины
# Конфигурирование и сборка
sudo mkdir /usr/local/qt6.5.2
 ./configure -release -nomake examples -nomake tests -prefix /usr/local/qt6.5.2
 cmake --build . --parallel
 sudo cmake --install .
Создадим директорию firefly-conf и внутри два файла: qmake.conf и qplatformdefs.h
Файл qplatformdefs.h
#include "../../linux-g++/qplatformdefs.h"
Файл qmake.conf
# qmake configuration for the Firefly

include(../common/linux_device_pre.conf)

QT_QPA_DEFAULT_PLATFORM = xcb

SYSROOT_INC = $$[QT_SYSROOT]/usr/include
SYSROOT_LIB = $$[QT_SYSROOT]/usr/lib

# Extra stuff (OpenGL, DirectFB, ...)
QMAKE_INCDIR_EGL        = $$[SYSROOT_INC] \
                          $$[SYSROOT_INC]/aarch64-linux-gnu \
                          $$[SYSROOT_INC]/GL \
                          $$[SYSROOT_INC]/EGL \
                          $$[SYSROOT_INC]/GLES \
                          $$[SYSROOT_INC]/GLES2 \
                          $$[SYSROOT_INC]/GLES3 
QMAKE_LIBDIR_EGL        = $$[SYSROOT_LIB] \
                          $$[SYSROOT_LIB]/aarch64-linux-gnu
QMAKE_INCDIR_OPENGL_ES2 = $$[QMAKE_INCDIR_EGL]
QMAKE_LIBDIR_OPENGL_ES2 = $${QMAKE_LIBDIR_EGL}
QMAKE_INCDIR_OPENVG     = $${QMAKE_INCDIR_EGL}
QMAKE_LIBDIR_OPENVG     = $${QMAKE_LIBDIR_EGL}


QMAKE_LIBS_EGL          = -lEGL 
QMAKE_LIBS_OPENGL_ES2   = -lGLESv2 $${QMAKE_LIBS_EGL}
QMAKE_LIBS_OPENVG       = -lOpenVG $${QMAKE_LIBS_EGL}

#modifications to gcc-base.conf
COMPILER_FLAGS         = -march=armv8-a
QMAKE_CFLAGS           = $${COMPILER_FLAGS}
QMAKE_CXXFLAGS         = $${COMPILER_FLAGS}
QMAKE_CXXFLAGS_RELEASE += -O3

QMAKE_LIBS              += -lrt -lpthread -ldl

DISTRO_OPTS += aarch64
DISTRO_OPTS += deb-multi-arch


include(../common/linux_arm_device_post.conf)

load(qt_config)
# Копируем конфигураци
cd qt-everywhere-src-6.5.2
cp -r /home/ruslan/firefly-conf qtbase/mkspecs/devices
Директории куда будем качать файлы с целевой машины
mkdir -p ~/sys-root && mkdir  ~/sys-root/usr && mkdir ~/sys-root/usr/share
Качаем файлы с целевой машины
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh" firefly@192.168.77.16:/lib ~/sys-root/  
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh" firefly@192.168.77.16:/usr/lib ~/sys-root/usr  
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh" firefly@192.168.77.16:/usr/include ~/sys-root/usr  
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh" firefly@192.168.77.16:/usr/share/pkgconfig ~/sys-root/usr/share
Решаем проблему с символьными ссылками
#Символьные ссылки
wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py 
python3 sysroot-relativelinks.py $TARGET_SYSROOT

sudo apt install symlinks
cd ~
symlinks -rc rpi-sysroot
Создадим файл toolchain-firefly.cmake
cmake_minimum_required(VERSION 3.18)
include_guard(GLOBAL)

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(TARGET_SYSROOT "/home/ruslan/sys-root")
set(CMAKE_SYSROOT ${TARGET_SYSROOT})

set(ENV{PKG_CONFIG_PATH} $PKG_CONFIG_PATH:/usr/lib/aarch64-linux-gnu/pkgconfig)
set(ENV{PKG_CONFIG_LIBDIR} /usr/lib/pkgconfig:/usr/share/pkgconfig/:${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig:${TARGET_SYSROOT}/usr/lib/pkgconfig)
set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT})


set(CMAKE_C_COMPILER    "aarch64-linux-gnu-gcc")
set(CMAKE_CXX_COMPILER  "aarch64-linux-gnu-g++")


set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${TARGET_SYSROOT}/usr/include")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")

set(QT_COMPILER_FLAGS "-march=armv8-a")
set(QT_COMPILER_FLAGS_RELEASE "-O2 -pipe")
#set(QT_LINKER_FLAGS "-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed")
#set(QT_LINKER_FLAGS "-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed,-rpath=${TARGET_SYSROOT}/usr/lib")
set(QT_LINKER_FLAGS "-Wl,-fuse-ld=gold -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -Wl,-rpath=${TARGET_SYSROOT}/usr/lib,-rpath=${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu")

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)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
set(CMAKE_BUILD_RPATH ${TARGET_SYSROOT})


set(CMAKE_THREAD_LIBS_INIT "-lrt -lpthread -ldl")
set(CMAKE_HAVE_THREADS_LIBRARY 1)
set(CMAKE_USE_WIN32_THREADS_INIT 0)
set(CMAKE_USE_PTHREADS_INIT 1)
set(THREADS_PREFER_PTHREAD_FLAG ON)


include(CMakeInitializeConfigs)

function(cmake_initialize_per_config_variable _PREFIX _DOCSTRING)
  if (_PREFIX MATCHES "CMAKE_(C|CXX|ASM)_FLAGS")
    set(CMAKE_${CMAKE_MATCH_1}_FLAGS_INIT "${QT_COMPILER_FLAGS}")
        
    foreach (config DEBUG RELEASE MINSIZEREL RELWITHDEBINFO)
      if (DEFINED QT_COMPILER_FLAGS_${config})
        set(CMAKE_${CMAKE_MATCH_1}_FLAGS_${config}_INIT "${QT_COMPILER_FLAGS_${config}}")
      endif()
    endforeach()
  endif()


  if (_PREFIX MATCHES "CMAKE_(SHARED|MODULE|EXE)_LINKER_FLAGS")
    foreach (config SHARED MODULE EXE)
      set(CMAKE_${config}_LINKER_FLAGS_INIT "${QT_LINKER_FLAGS}")
    endforeach()
  endif()

  _cmake_initialize_per_config_variable(${ARGV})
endfunction()

set(XCB_PATH_VARIABLE ${TARGET_SYSROOT})

set(GL_INC_DIR ${TARGET_SYSROOT}/usr/include)
set(GL_LIB_DIR ${TARGET_SYSROOT}:${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/:${TARGET_SYSROOT}/usr:${TARGET_SYSROOT}/usr/lib)

set(EGL_INCLUDE_DIR ${GL_INC_DIR})
set(EGL_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libEGL.so)

set(OPENGL_egl_LIBRARY ${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/libEGL.so)

set(OPENGL_INCLUDE_DIR ${GL_INC_DIR})
set(OPENGL_opengl_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libOpenGL.so)

set(GLESv2_INCLUDE_DIR ${GL_INC_DIR})
set(GLIB_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libGLESv2.so)

set(GLESv2_INCLUDE_DIR ${GL_INC_DIR})
set(GLESv2_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libGLESv2.so)

set(gbm_INCLUDE_DIR ${GL_INC_DIR})
set(gbm_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libgbm.so)

set(Libdrm_INCLUDE_DIR ${GL_INC_DIR})
set(Libdrm_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libdrm.so)

set(XCB_XCB_INCLUDE_DIR ${GL_INC_DIR})
set(XCB_XCB_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libxcb.so) 
# Линковщик -fuse-ld=gold чтобы устранить проблему с undefined reference и тому подобное:
# libdl.so.2: undefined reference to `_dl_sym@GLIBC_PRIVATE'
# libpthread.so.0: undefined reference to `__libc_dlclose@GLIBC_PRIVATE'
# toolchain-firefly
set(QT_LINKER_FLAGS "-Wl,-fuse-ld=gold -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -Wl,-rpath=${TARGET_SYSROOT}/usr/lib,-rpath=${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu")
# Конфигурация1
./configure -release -opengl es2 -nomake examples -nomake tests -qt-host-path /usr/local/qt6.5.2 -extprefix /usr/local/qt-firefly -prefix /usr/local/qt6arm -device firefly-conf -device-option CROSS_COMPILE=aarch64-linux-gnu- -- -DCMAKE_TOOLCHAIN_FILE=/home/ruslan/toolchain-firefly.cmake
# Конфигурация№2
./configure -release -opengl es2 -skip qtwebengine -nomake examples -nomake tests -qt-host-path /usr/local/qt6.5.2 -extprefix /usr/local/qt-firefly -prefix /usr/local/qt6arm -device firefly-conf -device-option CROSS_COMPILE=aarch64-linux-gnu- -- -DCMAKE_TOOLCHAIN_FILE=/home/ruslan/toolchain-firefly.cmake -DQT_FEATURE_xcb=ON -DFEATURE_xcb_xlib=ON -DQT_FEATURE_xlib=ON
# toolchain-firefly.cmake
toolchain-firefly.cmake -> -rpath=/home/ruslan/sys-root/usr/lib
Сборка
cmake --build . --parallel
sudo cmake --install .
# Флаг линковки для Qmake
QMAKE_LFLAGS += -fuse-ld=gold
# Настройка QtCreator
Projects->Kit Configuration->Cmake Configuration->Change
-DCMAKE_TOOLCHAIN_FILE:UNINITIALIZED=/path/to/qt-raspi/lib/cmake/Qt6/qt.toolchain.cmake

Комментарии