Ubuntu Qt x64平台搭建 arm64 编译套件

环境:
主机平台:Ubuntu22.04.5 x86_64
目标平台:IMX8QM Ubuntu22.04.5 arm64
Qt版本:Qt6.5.3 LST
GUI实现:QML

一、获取Ubuntu22.04.5 x86_64 系统镜像文件

1、镜像下载与安装

使用国内镜像下载对应版本的Ubuntu镜像,我使用的是阿里云的镜像

2、安装虚拟机

3、安装后的一些问题的解决

Ubuntu18.6 学习QT问题记录以及虚拟机安装Ubuntu后的设置

4、C/C++ 开发环境安装

二、目标平台安装 Qt 6.5.3

1、下载在线安装程序

在Qt 官网下载Qt在线安装包,这里需要在官网注册一个账号,登陆后才可以下载,我下载Linux x64版本。

2、Ubuntu开启ftp服务,上传qt在线安装程序。

3、命令行启动,使用阿里云镜像

给在线安装程序可执行权限

bash 复制代码
./qt-online-installer-linux-x64-4.10.0.run  --mirror https://mirrors.aliyun.com/qt/

4、下载所需版本

Qt提示需要安装库

使用apt安装库文件,下载所需版本和组件


5、配置Qt所需环境(在步骤4时已安装)

bash 复制代码
sudo apt install libxcb-cursor0 libxcb-cursor-dev
sudo apt-get install build-essential libgl1-mesa-dev

1、libxcb-cursor0 和 libxcb-cursor-dev 是与 XCB(X C Binding) 相关的库,主要用于在 Linux 系统中处理鼠标光标(cursor)相关的功能。
2、build-essential这是一个元包(meta-package),它会自动安装一系列编译 C/C++ 程序所需的基础工具和库,包括:
编译器:gcc(GNU C 编译器)、g++(GNU C++ 编译器)
构建工具:make(用于解析 Makefile 并执行编译流程)
标准库:libc6-dev(GNU C 标准库的开发文件)等
作用:提供编译 C/C++ 程序的最小环境。几乎所有需要编译源码的场景(包括 Qt 项目构建)都需要先安装它,否则会出现 "缺少编译器""无法识别 make 命令" 等错误。
3、这是 Mesa 3D 图形库的开发包,主要提供:OpenGL 接口的实现(用于 2D/3D 图形渲染)头文件(如 GL/gl.h)和链接库,供程序编译时调用
作用:
Qt(尤其是涉及图形渲染的模块,如 Qt Widgets、Qt Quick)依赖 OpenGL 进行界面绘制。如果缺少这个包,编译 Qt 项目时可能会出现 "找不到 GL 库""无法链接 OpenGL" 等错误,导致图形界面程序无法构建或运行。

** 注意:使用在线安装工具安装qt后,第一次运行工程出现error: cmake project configuration failed. no cmake configuration for build type "debug" found. check general messages for more information.错误,可能是没有设置Qt运行环境**

6、创建示例工程并测试

创建工程运行报错,安装如下库后回复正常,错误内容为:error: cmake project configuration failed. no cmake configuration for build type "debug" found. check general messages for more information.

安装OpenGl相关依赖库

c 复制代码
sudo apt update && sudo apt install libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev

安装xcb 插件依赖

c 复制代码
sudo apt install libxcb-cursor0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0

7、运行从git 下载的Qt项目

这个项目时从我的另一台电脑上的Ubuntu虚拟机上传到GIT的,Qt版本一致,运行前先配置项目中的CAMKE等设置,因为两台Ubuntu虚拟机安装Qt的目录不同,否则会报错

三、交叉编译环境搭建(参考野火教程)

野火Qt6交叉编译教程

1、宿主机下载相关库与工具

c 复制代码
sudo apt update
sudo apt install libssl-dev gperf pkg-config git bison ninja-build
sudo apt install make build-essential libclang-dev \
   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

2、获取并安装交叉编译器

这里我直接用命令下载的编译器

bash 复制代码
wangju@wangju-virtual-machine:~$ which aarch64-linux-gnu-g++
/usr/bin/aarch64-linux-gnu-g++
wangju@wangju-virtual-machine:~$ which g++
/usr/bin/g++
wangju@wangju-virtual-machine:~$ 

3、构建sysroot目录

板卡下载相关库

c 复制代码
# 安装一些库和工具等,按自己需要安装
sudo apt update

# x11相关
sudo apt-get install -y libx11-dev freetds-dev libsqlite0-dev libpq-dev libiodbc2-dev firebird-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

# gst 1.0相关
sudo apt-get install -y libgstreamer1.0-0 gstreamer1.0-plugins-base \
   gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly \
   gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools libunwind-dev

# 其他等等
sudo apt-get install -y libfreetype6-dev libicu-dev libsqlite3-dev libasound2-dev libnss3-dev \
   libxss-dev libxtst-dev libpci-dev libcap-dev libsrtp0-dev libxrandr-dev libdirectfb-dev libaudio-dev \
   libavcodec-dev libavformat-dev libswscale-dev libts-dev libfontconfig1-dev

sudo apt-get install -y libssl-dev libdbus-1-dev libglib2-dev libegl1-mesa-dev \
   libgbm-dev libgles2-mesa-dev libgles2-mesa rsyslog  libjpeg-dev

然后我将 /lib /usr 这两个目录通过ftp全部下载到了主机上。具体可以参考野火教程

4、安装CMAKE(源码编译安装)

先用命令安装cmake。

按照野火教程,先为主机编译安装qt源码。

然后新建一个cmake 工具链文件,用来指定CMAKE相关参数(交叉编译需要)

bash 复制代码
# 这里设置cmake支持的最小版本
cmake_minimum_required(VERSION 3.18)
include_guard(GLOBAL)

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

# 指定sysroot目录 需要自己修改
set(TARGET_SYSROOT /home/wangju/develope/sysroot) 

# 指定前面获取的交叉编译器路径  需要自己修改
set(CROSS_COMPILER /usr/bin/aarch64-linux-gnu)

set(CMAKE_SYSROOT ${TARGET_SYSROOT})

set(CMAKE_C_COMPILER ${CROSS_COMPILER}-gcc)
set(CMAKE_CXX_COMPILER ${CROSS_COMPILER}-g++)

set(CMAKE_LIBRARY_ARCHITECTURE aarch64-linux-gnu)

# 库路径
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -Wl,-rpath-link,${CMAKE_SYSROOT}/lib/${CMAKE_LIBRARY_ARCHITECTURE} -fPIC -Wl,-rpath-link,${CMAKE_SYSROOT}/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE} -L${CMAKE_SYSROOT}/lib -L${CMAKE_SYSROOT}/lib/${CMAKE_LIBRARY_ARCHITECTURE}  -L${CMAKE_SYSROOT}/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE} -L${CMAKE_SYSROOT}/usr/lib -I${TARGET_SYSROOT}/usr/include -I${TARGET_SYSROOT}/usr/include/${CMAKE_LIBRARY_ARCHITECTURE}")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")

# pkg config路径
set(ENV{PKG_CONFIG_PATH} ${TARGET_SYSROOT}/usr/lib/pkgconfig:${TARGET_SYSROOT}/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/pkgconfig:${TARGET_SYSROOT}/usr/share/pkgconfig/)
set(ENV{PKG_CONFIG_LIBDIR} ${TARGET_SYSROOT}/usr/lib/pkgconfig:${TARGET_SYSROOT}/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/pkgconfig:${TARGET_SYSROOT}/usr/share/pkgconfig/)
set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT})

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 -Wl,-fuse-ld=gold -ldbus-1")

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)

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()

然后在qt源码目录执行cmake配置命令

c 复制代码
cat arm64_cmake 
cmake ../ -GNinja -DCMAKE_BUILD_TYPE=Release  -DINPUT_opengl=es2 -DQT_BUILD_EXAMPLES=OFF -DQT_BUILD_TESTS=OFF -DQT_HOST_PATH=/home/wangju/develope/qt/qt6Host -DCMAKE_STAGING_PREFIX=/home/wangju/develope/sysroot/opt/prefix -DCMAKE_INSTALL_PREFIX=/home/wangju/develope/sysroot/opt/prefix -DCMAKE_TOOLCHAIN_FILE=/home/wangju/develope/lubancat_toolchain.cmake  -DQT_QMAKE_TARGET_MKSPEC=devices/linux-imx8-g++ -DQT_FEATURE_xcb=OFF -DFEATURE_xcb_xlib=OFF -DQT_FEATURE_xlib=OFF -DQT_FEATURE_eglfs=ON -DQT_FEATURE_wayland=ON  -DFEATURE_qtwebengine_build=OFF 

因为我的sysroot 缺少 X11 相关德 库,所以将xcb 编译选项关闭,-DQT_FEATURE_xcb=OFF -DFEATURE_xcb_xlib=OFF -DQT_FEATURE_xlib=OFF。 开启了-DQT_FEATURE_eglfs=ON -DQT_FEATURE_wayland=ON ,对于 i.MX8QM 这样的嵌入式设备,使用 EGLFS 或 Wayland 作为图形后端比使用传统的 X11/XCB 更加合适,i.MX8QM 具有强大的 Vivante GPU,EGLFS 可以直接利用硬件加速。对于野火文件中的设备文件,我发现qt源码中有 NXP 的 imx8系列设备的模板,我直接用的官方的设备文件。

c 复制代码
#
# qmake configuration for the NXP i.MX8 based boards (64-bit)
#
# The configuration below is set up for running with the fbdev-style
# Vivante graphics stack. (so eglfs with the eglfs_viv backend, no
# direct drm use via eglfs_kms)

# Wayland should also be functional. However, when writing Wayland
# *compositors* with Qt, the eglfs backend will have to be switched to
# eglfs_viv_wl by setting the QT_QPA_EGLFS_INTEGRATION environment
# variable.
#
# Below is an example configure line that assumes there is an AArch64
# toolchain and sysroot available in $HOME/imx8. On device Qt is
# expected to be placed under /usr/local/qt514 whereas on the host
# 'make install' will copy the host tools and the target libraries to
# $HOME/imx8/qt5.
#
# ./configure -release -opengl es2 -device linux-imx8-g++ \
#   -device-option CROSS_COMPILE=~/imx8/toolchain/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux- \
#   -sysroot ~/imx8/sysroot \
#   -opensource -confirm-license -make libs -prefix /usr/local/qt514 -extprefix ~/imx8/qt5 -v

include(../common/linux_device_pre.conf)

QMAKE_LIBS_EGL         += -lEGL
QMAKE_LIBS_OPENGL_ES2  += -lGLESv2 -lEGL -lGAL
QMAKE_LIBS_OPENVG      += -lOpenVG -lEGL -lGAL

IMX8_CFLAGS             = -march=armv8-a -mtune=cortex-a72.cortex-a53 -DLINUX=1 -DEGL_API_FB=1
QMAKE_CFLAGS           += $$IMX8_CFLAGS
QMAKE_CXXFLAGS         += $$IMX8_CFLAGS

DISTRO_OPTS += aarch64

# Preferred eglfs backend
EGLFS_DEVICE_INTEGRATION = eglfs_viv

include(../common/linux_arm_device_post.conf)

load(qt_config)

最后执行cmake 编译命令、编译完后安装。这里要注意编译所需空间大,如果按照野火教程,先为主机编译qt源码,所需空间较大,建立虚拟机时应该一次性刚给100G 左右的空间,大一点最好,不然在编译或者安装时会出现空间不足导致安装失败的情况。建立好虚拟机后扩展磁盘或者添加磁盘比较麻烦,最好一次给够。

问题记录

1、QT 引用资源文件报错问题(已解决)

2、QT工程 Windows 移动到 Linux ,编译报错问题

3、上传到git的Qt项目在另一台虚拟机再次下载后编译报错问题

4、如何下载目标平台对应版本的编译器

最好是开发板系统和主机系统版本一致。

5、使用在线安装安装qt后创建项目报错,CAMKE找不到Qt6Quick 、QtWidget等组件

依次安装了 C/C++开发工具、OpenGL 依赖、xcb依赖,具体是那个的问题不清楚,具体安装步骤在上文列举了。

6、下载公版arm sysroot ,使用 chroot 为 sysroot 下载必要库文件

1、chroot使用前更换sysroot apt源为国内源
bash 复制代码
sudo chroot /path/to/arm-sysroot /bin/bash
cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 清空原有内容并写入清华源
cat > /etc/apt/sources.list << EOF
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse
EOF
# 更新源列表
apt update

# 测试是否能正常下载(可选)
apt install -y vim  # 安装一个小工具验证

使用apt前要将宿主机文件系统挂在到sysroot,否则无网络

2、chroot使用前挂在必要的文件系统,如网络等
c 复制代码
sudo mount --bind /dev /path/to/arm-sysroot/dev
sudo mount -t proc /proc /path/to/arm-sysroot/proc
sudo mount --bind /sys /path/to/arm-sysroot/sys
# 使用完毕,卸载
sudo umount /path/to/arm-sysroot/dev
sudo umount /path/to/arm-sysroot/proc
sudo umount /path/to/arm-sysroot/sys
3、chroot 在x86上运行 arm的sysroot,需要下载QEMU 模拟器
bash 复制代码
sudo apt update
sudo apt install qemu-user-static binfmt-support
sudo cp /usr/bin/qemu-arm-static sysroot/usr/bin/
4、挂载文件系统后没网,可能是sysyroot DNS需要设置
c 复制代码
sudo cp /etc/resolv.conf sysroot/etc/
sudo nano sysroot/etc/resolv.conf
nameserver 114.114.114.114
nameserver 8.8.8.8
nameserver 223.5.5.5
5、每次进入前挂载宿主机目录
相关推荐
jakeswang6 小时前
全解MySQL之死锁问题分析、事务隔离与锁机制的底层原理剖析
数据库·mysql
Heliotrope_Sun6 小时前
Redis
数据库·redis·缓存
一成码农6 小时前
MySQL问题7
数据库·mysql
吃饭最爱6 小时前
JUnit技术的核心和用法
数据库·oracle·sqlserver
专注API从业者6 小时前
Python/Java 代码示例:手把手教程调用 1688 API 获取商品详情实时数据
java·linux·数据库·python
眠りたいです6 小时前
基于脚手架微服务的视频点播系统-播放控制部分
c++·qt·ui·微服务·云原生·架构·播放器
Ribou7 小时前
Ubuntu 24.04.2安装k8s 1.33.4 配置cilium
linux·ubuntu·kubernetes
雨落Liy7 小时前
SQL 函数从入门到精通:原理、类型、窗口函数与实战指南
数据库·sql
Kt&Rs7 小时前
MySQL复制技术的发展历程
数据库·mysql