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、每次进入前挂载宿主机目录
相关推荐
·云扬·4 分钟前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德7 分钟前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫32 分钟前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i41 分钟前
完全卸载MariaDB
数据库·mariadb
纤纡.1 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn1 小时前
【Redis】渐进式遍历
数据库·redis·缓存
橙露1 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot
冰暮流星1 小时前
sql语言之分组语句group by
java·数据库·sql
符哥20081 小时前
Ubuntu 常用指令集大全(附实操实例)
数据库·ubuntu·postgresql
C++ 老炮儿的技术栈2 小时前
Qt 编写 TcpClient 程序 详细步骤
c语言·开发语言·数据库·c++·qt·算法