问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Qt交叉编译实战:从x86到ARM的完整指南

创作时间:
作者:
@小白创作中心

Qt交叉编译实战:从x86到ARM的完整指南

引用
CSDN
7
来源
1.
https://blog.csdn.net/whongfa/article/details/139956622
2.
https://blog.csdn.net/qianniulaoren/article/details/139028554
3.
https://blog.csdn.net/weixin_40355471/article/details/135998464
4.
https://blog.csdn.net/mirror360/article/details/140065159
5.
https://blog.csdn.net/xxzhaoming/article/details/139907023
6.
https://doc.embedfire.com/linux/rk356x/Qt/zh/latest/lubancat_qt/install/install_arm_2.html
7.
https://doc.embedfire.com/linux/rk356x/Qt/zh/latest/lubancat_qt/qtdemo/demo_run.html

在嵌入式开发中,Qt框架因其跨平台特性和丰富的GUI功能而广受欢迎。然而,从x86开发环境到ARM目标平台的交叉编译过程却常常让开发者感到头疼。本文将详细介绍如何在Linux环境下搭建Qt的交叉编译环境,从工具链安装到最终程序部署,帮助你轻松完成从开发到运行的全过程。

01

环境准备

1.1 安装交叉编译工具链

首先需要获取适用于ARM平台的交叉编译工具链。这里以aarch64-linux-gnu-gcc为例,你可以从芯片厂商或开源社区获取相应的工具链包。安装步骤通常包括解压和配置环境变量:

# 解压工具链到指定目录
tar -xvf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz -C /usr/local

# 配置环境变量
echo 'export PATH="/usr/local/aarch64-none-linux-gnu/bin:$PATH"' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH="/usr/local/aarch64-none-linux-gnu/lib:$LD_LIBRARY_PATH"' >> ~/.bashrc
source ~/.bashrc

1.2 安装依赖库

为了确保Qt能够正常编译和运行,需要在开发主机上安装一系列依赖库。这些库将通过交叉编译工具链部署到目标平台。以下是部分关键库的安装命令:

sudo apt-get install -y libx11-dev libxcb1-dev libx11-xcb-dev libxcb-keysyms1-dev \
libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-render-util0-dev \
libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-glx0-dev \
libfreetype6-dev libfontconfig1-dev libssl-dev libdbus-1-dev libglib2.0-dev

此外,如果使用OpenGL功能,还需要安装OpenGL相关的库:

sudo apt-get install -y libegl1-mesa-dev libgbm-dev libgles2-mesa-dev
02

qmake配置

qmake是Qt的构建系统,正确配置qmake是实现交叉编译的关键。首先需要修改Qt源码中qmake的配置文件。在Qt源码目录下,找到qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf,根据你的工具链路径进行相应修改。

例如,将以下内容添加到qmake.conf中:

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

QMAKE_CC                = aarch64-none-linux-gnu-gcc
QMAKE_CXX               = aarch64-none-linux-gnu-g++
QMAKE_LINK              = aarch64-none-linux-gnu-g++
QMAKE_LINK_SHLIB        = aarch64-none-linux-gnu-g++

接下来,创建一个配置脚本(如configure.sh),用于指定交叉编译参数:

#!/bin/bash
./configure -release -opensource -confirm-license \
-prefix /path/to/install \
-sysroot /path/to/sysroot \
-xplatform linux-aarch64-gnu-g++ \
-nomake examples -nomake tests \
-skip qtwebengine -skip qt3d -skip qtquick3d
03

Qt源码编译

在完成上述配置后,就可以开始编译Qt源码了。在源码根目录下执行以下命令:

chmod +x configure.sh
./configure.sh
make -j4
sudo make install

这里使用-j4参数来加速编译过程,具体数值可以根据你的CPU核心数调整。

04

调用so库

在开发过程中,你可能需要调用外部的so库。为了确保这些库能够在目标平台上正确运行,需要进行交叉编译。假设你已经获得了库的源码,可以使用以下命令进行交叉编译:

aarch64-none-linux-gnu-gcc -shared -o libmylib.so mylib.c

编译完成后,将生成的so库复制到目标系统的适当位置。在Qt项目中,可以通过.pro文件指定库的路径:

LIBS += -L/path/to/lib -lmylib

为了确保程序能够找到so库,还需要设置rpath:

chrpath -r '$ORIGIN' /path/to/your/application
05

常见问题与解决方案

在实际操作中,你可能会遇到以下问题:

  1. 缺少依赖库:确保所有必要的库都已安装,并且在configure阶段正确指定了--sysroot参数。

  2. qmake找不到工具链:检查环境变量是否正确配置,确保交叉编译工具链在系统路径中。

  3. 运行时找不到so库:确认so库已正确部署到目标系统,并且应用程序的rpath设置正确。

  4. XCB支持问题:如果遇到XCB相关错误,确保在配置阶段包含了-xcb参数,并且所有XCB相关库都已正确安装。

通过以上步骤,你应该能够成功搭建Qt的交叉编译环境,并将应用程序部署到ARM平台。虽然这个过程可能看起来有些复杂,但一旦环境配置完成,后续的开发工作就会变得简单许多。希望本文能帮助你顺利开启嵌入式Qt开发之旅!

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号