移植Qt到ARM平台及搭建Qt交叉编译环境

本文详细介绍了如何在ARM平台上搭建Qt运行环境,包括编译tslib库、移植tslib到文件系统、交叉编译Qt源码、移植Qt到文件系统以及在Ubuntu上配置QtCreator的交叉编译环境。此外,还提到了通过qmake和make直接编译生成Qt可执行文件的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。

要想在ARM平台上运行Qt程序,得满足以下两个点:
1、ARM平台上搭建Qt运行环境
2、获得通过交叉编译后的Qt可执行文件

一、编译tslib库

从网上下载 tslib 源码压缩包,发送到 Ubuntu 中并解压,进入tslib源码目录,内容如下所示:
在这里插入图片描述
执行命令安装以下软件:

sudo apt-get update
sudo apt-get install autoconf automake libtool

执行 autogen.sh 生成 Makefile:

./autogen.sh

配置使用的交叉编译器及 tslib 编译输出路径:

./configure --host=arm-linux-gnueabihf ac_cv_func_malloc_0_nonnull=yes --cache-file=arm-linux.
cache -prefix=/home/xzj/tslib-1.21/arm-tslib

直接执行 make 编译及 make install 安装:

make
make install

安装完成后在当前目录下生成一个 arm-tslib 目录。也是我们上面指令的编译输出目录路径。可以查看生成目录下有以下内容:
在这里插入图片描述

二、移植 tslib 到文件系统

我把生成的 arm-tslib 放到了挂载的buildroot文件系统的跟目录,并改名为了 tslib。(可放在其它目录了,比如usr/lib,可不改名字,根据自己喜好,但接下来的环境变量要填对)
在这里插入图片描述
配置 tslib 的环境变量
打开文件系统根目录下的/etc/profile文件,填入以下内容:
在这里插入图片描述

三、编译Qt源码(用于移植到ARM)

从网上下载Qt源码 https://download.qt.io/,我下载的是5.12.9的版本。
在这里插入图片描述
放到 ubuntu 并解压得到 qt-everywhere-src-5.12.9源码目录
在这里插入图片描述
修改 qmake.conf,配置相关的编译器,默认使用arm-linux-gnueabi前缀。

gedit ./qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf

在这里插入图片描述

配置编译选项,输入./configure -help 指令,查看可配置选项,由于配置选项太长,我另写了一个脚本来执行配置选项,名为autoconfig.sh,配置主要指定编译输出路径和功能选择:

#!/bin/bash
./configure -prefix /home/xzj/tool/qt-everywhere-src-5.12.9/armqt-5.12.9 \
-opensource \
-confirm-license \
-release \
-strip \
-shared \
-xplatform linux-arm-gnueabi-g++ \
-optimized-qmake \
-c++std c++11 \
--rpath=no \
-pch \
-skip qt3d \
-skip qtactiveqt \
-skip qtandroidextras \
-skip qtcanvas3d \
-skip qtconnectivity \
-skip qtdatavis3d \
-skip qtdoc \
-skip qtgamepad \
-skip qtlocation \
-skip qtmacextras \
-skip qtnetworkauth \
-skip qtpurchasing \
-skip qtremoteobjects \
-skip qtscript \
-skip qtscxml \
-skip qtsensors \
-skip qtspeech \
-skip qtsvg \
-skip qttools \
-skip qttranslations \
-skip qtwayland \
-skip qtwebengine \
-skip qtwebview \
-skip qtwinextras \
-skip qtx11extras \
-skip qtxmlpatterns \
-make libs \
-make examples \
-nomake tools -nomake tests \
-gui \
-widgets \
-dbus-runtime \
--glib=no \
--iconv=no \
--pcre=qt \
--zlib=qt \
-no-openssl \
--freetype=qt \
--harfbuzz=qt \
-no-opengl \
-linuxfb \
--xcb=no \
-tslib \
--libpng=qt \
--libjpeg=qt \
--sqlite=qt \
-plugin-sql-sqlite \
-I/home/xzj/tool/tslib-1.21/arm-tslib/include \
-L/home/xzj/tool/tslib-1.21/arm-tslib/lib \
-recheck-all

给执行权限,执行脚本进行配置

chmod +x ./autoconfig.sh
sudo apt-get install g++ // 配置前请先安装 g++
./autoconfig.sh

配置完成够开始进行编译和安装,由于编译用时比较久,最好使用多指令同时运行:

make -j12
make install

执行安装指令后,会在当前目录生成一个 armqt-5.12.9 文件,配置时命名的输出文件:
在这里插入图片描述

四、移植Qt到文件系统

把刚才生成的 armqt-5.12.9 放到挂载的 buildroot 文件系统的/opt目录中:
在这里插入图片描述
要想Qt 程序显示中文,需把中文字库放到新建一个/usr/share/fonts/目录下。配置 Qt5 的环境变量,打开文件系统/etc/profile,添加如下内容:
在这里插入图片描述

以上就是搭建ARM平台(开发板)的Qt运行环境,接下来需要在ubuntu搭建Qt交叉编译环境。

五、搭建 Qt Creator 交叉编译环境

从网上下载安装包安装 Qt Creator, qt-opensource-linux-x64-5.12.9.run
在这里插入图片描述
下载完成后,给权限并执行安装:

chmod u+x qt-opensource-linux-x64-5.12.9.run
sudo ./qt-opensource-linux-x64-5.12.9.run

接下来就会弹出安装窗口,就跟在win安装应用一样了,省略。

安装完成后, 配置Qt Creator Kits。打开Qt,点击工具->选项
在这里插入图片描述

配置 qmake,qmake在上面编译Qt源码后生成的armqt-5.12.9里面
在这里插入图片描述
配置 C++编译器,这里我使用以前安装的交叉编译器,我的在ubuntu的/usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-g++

在这里插入图片描述

配置 Kits,选择刚才的Qt versions和C++编译器。
在这里插入图片描述
在这里插入图片描述
Qt环境搭建好了,可以新建一个项目试试,在新建项目时的Kits选项记得把刚才添加Kits也勾选上。

在这里插入图片描述
构建ARM平台上的Qt执行程序,就选上刚才新添加的Kit,然后点击构建,就会生成一个 build-test-ARM_Qt_5_12_9-Debug 的文件,里面就存放着Qt可执行程序,把这个可执行程序发送到ARM平台(开发板),然后直接运行就可以了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果想在ubuntu上运行,就选择默认的kit,然后直接点击绿色的三角形运行就可以了,同时会生成一个build-test-Desktop_Qt_5_12_9_GCC_64bit-Debug 文件,里面的可执行文件就是在ubuntu中运行的。
在这里插入图片描述
在这里插入图片描述

六、获得Qt可执行文件的另一种方法

除了上面说的在Qt Creator 中构建出可以在ARM平台上运行的Qt程序之外,还有另一种方法也可以得到可以在ARM平台上运行的Qt程序。

进入项目的文件夹,直接运行qmake,生成 Makefile,再执行 make 开始编译。

cd test
/home/xzj/tool/qt-everywhere-src-5.12.9/armqt-5.12.9/bin/qmake
make

在这里插入图片描述
在这里插入图片描述

<think>好的,用户问的是在将Qt移植ARM开发板时,一般显示会使用xcb还是Linuxcb。首先需要确认用户提到的Linuxcb是什么,因为在之前的对话中已经讨论过,用户可能打错了或者有误解。 用户可能是在ARM开发板上进行Qt移植,涉及到显示后端的选项。Qt支持多种显示后端,比如X11、Wayland、EGLFS等。xcb是X协议的一个轻量级库,而Linuxcb可能不存在,可能是用户误写。需要进一步确认用户的问题是否存在拼写错误,比如是否指LinuxFB(Linux Framebuffer)或者其他组件。 根据之前的历史,用户提到过xcb是X协议的C绑定库,而Linuxcb可能被混淆为Linux的某个组件,比如cgroups或者framebuffer。这时候需要再次澄清,可能用户想了解的是在ARM开发板上Qt应该使用哪种显示后端,比如xcb还是Linux framebuffer(fb)。 接下来需要考虑Qt在嵌入式系统常用的显示后端。通常,在资源受限的嵌入式设备上,可能会使用EGLFS(EGL Full Screen)或者LinuxFB,而不是xcb,因为xcb依赖X Window系统,而X Window系统在嵌入式环境中可能过于庞大和低效。但具体情况还要看开发板的硬件和软件环境,比如是否已经运行X11。 用户可能是在开发嵌入式应用,需要选择最适合的显示插件,以确保性能和资源占用最优。这时候需要解释Qt的不同显示插件及其适用场景,帮助用户根据实际情况选择。 另外,用户可能对术语不太熟悉,导致混淆。需要以简明的方式解释各个选项,并给出建议步骤,比如检查开发板是否有GPU,是否已经安装X11等,来帮助用户做出决策。 最后,总结时强调xcb适用于有X11的环境,而嵌入式设备通常使用EGLFS或LinuxFB,并建议用户根据具体情况配置Qt。</think>在将 **Qt 移植ARM 开发板** 时,显示后端的选择取决于目标设备的图形环境和需求。以下是针对 `xcb` 和可能的 `Linuxcb`(推测为误写)的分析与建议: --- ### 1. **Qt 的显示后端选项** Qt 支持多种图形后端(即 `platform plugins`),常见的包括: - **`xcb`**:基于 X Window 系统的后端,需依赖 X11 环境- **`eglfs`**:专为嵌入式设计的 OpenGL ES + EGL 全屏后端,直接通过 GPU 渲染,无需 X11。 - **`linuxfb`**:Linux 帧缓冲(Framebuffer)后端,直接操作显存,无硬件加速。 - **`wayland`**:Wayland 协议的后端(现代替代 X11 的方案)。 --- ### 2. **`xcb` 的适用场景** - **是否需要 X11 环境?** 若 ARM 开发板已运行完整的 **X Window 系统**(如搭配桌面环境),则 `xcb` 是合理选择。 - **优点**:兼容传统 X11 应用,支持多窗口管理。 - **缺点**:资源占用较高,不适合无 X11 的裸机或轻量级系统。 - **典型场景**:开发板运行 Ubuntu Desktop、Debian X11 等系统。 - **Qt 配置方法**: ```bash ./configure -xcb # 启用 xcb 支持 ``` --- ### 3. **嵌入式场景的首选:`eglfs` 或 `linuxfb`** 对于大多数 **无 X11 的 ARM 嵌入式设备**,推荐以下方案: #### (1) **`eglfs`(OpenGL ES + EGL 全屏)** - **适用条件**: 开发板具有 **GPU 硬件加速支持**(如 Mali、Adreno、Vivante 等),且已安装 GPU 驱动(如通过 `Mesa` 或厂商闭源驱动)。 - **优势**: - 直接通过 GPU 渲染,性能极高。 - 支持 OpenGL ES 2.0/3.0 和 Qt Quick 的硬件加速。 - **配置方法**: ```bash ./configure -eglfs # 启用 eglfs 支持 ``` #### (2) **`linuxfb`(Linux 帧缓冲)** - **适用条件**: 开发板无 GPU 或需极简图形输出,直接通过 CPU 操作显存。 - **优势**: - 无需 GPU 驱动,依赖极低。 - 适合低分辨率或非实时性要求的场景。 - **缺点**: - 无硬件加速,性能较差。 - **配置方法**: ```bash ./configure -linuxfb # 启用 linuxfb 支持 ``` --- ### 4. **关于 `Linuxcb` 的澄清** - **术语修正**: `Linuxcb` 并非 QtLinux 的标准术语,可能是对以下概念的误写: - **`linuxfb`**(Linux Framebuffer):如前所述,是 Qt 的帧缓冲后端。 - **`cgroups`**(Control Groups):Linux 内核功能,与图形无关。 - **自定义后端**:某些厂商可能提供私有显示驱动(需参考具体文档)。 --- ### 5. **移植步骤与建议** 1. **确认开发板图形环境**: - 检查是否运行 X11:执行 `ps aux | grep Xorg` 或检查 `/usr/bin/X` 是否存在。 - 检查 GPU 驱动:通过 `dmesg | grep -i gpu` 或 `glxinfo` 验证。 2. **选择 Qt 后端**: - **有 X11** → 使用 `xcb`。 - **有 GPU 加速** → 使用 `eglfs`。 - **无 GPU 且无 X11** → 使用 `linuxfb`。 3. **配置 Qt 编译选项**: ```bash # 示例:针对 eglfs 的典型配置 ./configure -prefix /opt/qt-embedded \ -opensource \ -confirm-license \ -eglfs \ -no-xcb \ # 禁用 xcb(若无需 X11) -opengl es2 \ # 启用 OpenGL ES -device <your-arm-device-spec> ``` 4. **部署与测试**: - 通过 `-platform` 参数指定运行时后端: ```bash ./your_qt_app -platform eglfs # 强制使用 eglfs ``` --- ### 6. **常见问题** - **`xcb` 在无 X11 环境报错**: 需确保 X11 库已安装,或改用 `eglfs/linuxfb`。 - **`eglfs` 黑屏或无显示**: 检查 GPU 驱动兼容性,确保 EGL 库(如 `libEGL.so`)存在。 - **触控/输入设备失效**: 需额外配置 `tslib` 或 `evdev` 输入插件。 --- ### 总结 - **优先选择 `eglfs`**:适用于带 GPU 的现代 ARM 开发板(如树莓派 4、NVIDIA Jetson)。 - **次选 `linuxfb`**:适合无 GPU 或资源极度受限的场景。 - **慎用 `xcb`**:仅在已部署 X11 的系统中使用。 - **`Linuxcb` 无效**:需修正为 `linuxfb` 或其他标准后端。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值