环境:
主机平台: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、命令行启动,使用阿里云镜像
给在线安装程序可执行权限
./qt-online-installer-linux-x64-4.10.0.run --mirror https://mirrors.aliyun.com/qt/
4、下载所需版本
Qt提示需要安装库
使用apt安装库文件,下载所需版本和组件
5、配置Qt所需环境(在步骤4时已安装)
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相关依赖库
sudo apt update && sudo apt install libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev
安装xcb 插件依赖
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、宿主机下载相关库与工具
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、获取并安装交叉编译器
这里我直接用命令下载的编译器
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目录
板卡下载相关库
# 安装一些库和工具等,按自己需要安装
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-devsudo 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相关参数(交叉编译需要)
# 这里设置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配置命令
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系列设备的模板,我直接用的官方的设备文件。
#
# 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 -vinclude(../common/linux_device_pre.conf)QMAKE_LIBS_EGL += -lEGL
QMAKE_LIBS_OPENGL_ES2 += -lGLESv2 -lEGL -lGAL
QMAKE_LIBS_OPENVG += -lOpenVG -lEGL -lGALIMX8_CFLAGS = -march=armv8-a -mtune=cortex-a72.cortex-a53 -DLINUX=1 -DEGL_API_FB=1
QMAKE_CFLAGS += $$IMX8_CFLAGS
QMAKE_CXXFLAGS += $$IMX8_CFLAGSDISTRO_OPTS += aarch64# Preferred eglfs backend
EGLFS_DEVICE_INTEGRATION = eglfs_vivinclude(../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源为国内源
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使用前挂在必要的文件系统,如网络等
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 模拟器
sudo apt update
sudo apt install qemu-user-static binfmt-support
sudo cp /usr/bin/qemu-arm-static sysroot/usr/bin/
4、挂载文件系统后没网,可能是sysyroot DNS需要设置
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