【QT开发】交叉编译QT程序在ARMLinux平台上运行

目录

  • [1. 环境准备](#1. 环境准备)
  • [2. 获取QT源码(下载QT6源码运行QT5程序可能不兼容,本人是QT5程序)](#2. 获取QT源码(下载QT6源码运行QT5程序可能不兼容,本人是QT5程序))
  • [3 QT库文件移植至ARMLinux平台](#3 QT库文件移植至ARMLinux平台)
  • [4 Ubuntu上交叉编译程序源代码](#4 Ubuntu上交叉编译程序源代码)
  • [5 移植编译好的可执行程序到ARMLinux平台并运行](#5 移植编译好的可执行程序到ARMLinux平台并运行)
  • [6 运行效果(分为Windows,Ubuntu虚拟机,ARMLinux三个平台)](#6 运行效果(分为Windows,Ubuntu虚拟机,ARMLinux三个平台))
  • [7 总结](#7 总结)

1. 环境准备

安装必要的工具

bash 复制代码
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install git build-essential cmake python3

# 安装交叉编译工具链
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

2. 获取QT源码(下载QT6源码运行QT5程序可能不兼容,本人是QT5程序)

获取QT5源码(使用可用的版本)本人亲测找了半天不好找能下载的,所以直接让deepseek生成脚本自己寻找安装

bash 复制代码
# 方法1:使用wget尝试多个版本
for version in 5.15.8 5.15.7 5.15.6 5.15.5; do
    wget https://download.qt.io/archive/qt/5.15/$version/single/qt-everywhere-opensource-src-$version.tar.xz && break
done

# 方法2:如果上述都失败,使用国内镜像
wget https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/5.15/5.15.2/single/qt-everywhere-opensource-src-5.15.2.tar.xz

# 方法3:从GitHub获取
git clone https://github.com/qt/qt5.git
cd qt5
git checkout 5.15
git submodule update --init --recursive

解压QT源码

c 复制代码
tar -xf qt-everywhere-opensource-src-5.15.2.tar.xz

解压完以后进入。

配置QT编译选项

配置之前先检查自己的交叉编译工具,命令行输入aa,然后双击Tab键,可以检查自己的交叉编译工具,如果没有请百度搜索安装。以下是我的交叉编译工具:

然后进入指定文件继续配置,这里注意红框内修改为自己的交叉编译工具链。

bash 复制代码
cd qt-everywhere-src-5.15.8
cd qtbase/mkspecs/
vi linux-arm-gnueabi-g++/qmake.conf

PS:然后再下载安装交叉编译tslib(支持触摸屏)库,这里是因为我编译QT源码的时候出现了很多问题,尤其是ERROR: Feature 'tslib' was enabled, but the pre-condition 'libs.tslib' faile(看网上有大佬说这个问题其实可以通过降低QT源码版本解决,但是由于自己不想再回去重新下载了),所以我自己用deepseek探索着增加了以下几步:

bash 复制代码
# 安装编译工具和依赖
sudo apt update
sudo apt install -y \
    build-essential \
    autoconf \
    automake \
    libtool \
    pkg-config
    
# 下载tslib
wget https://github.com/libts/tslib/releases/download/1.22/tslib-1.22.tar.xz
tar -xf tslib-1.22.tar.xz
cd tslib-1.22

# 完整的交叉编译配置
../configure \
    --host=aarch64-linux-gnu \
    --prefix=/opt/tslib-aarch64 \
    CC=aarch64-linux-gnu-gcc \
    CXX=aarch64-linux-gnu-g++ \
    AR=aarch64-linux-gnu-ar \
    STRIP=aarch64-linux-gnu-strip \
    RANLIB=aarch64-linux-gnu-ranlib \
    --enable-static=yes \
    --enable-shared=yes \
    ac_cv_func_malloc_0_nonnull=yes

# 编译
make -j$(nproc)

# 安装(需要root权限因为安装到/opt)
sudo make install

# 设置环境变量
export TSLIB_CFLAGS="-I/opt/tslib-aarch64/include"
export TSLIB_LIBS="-L/opt/tslib-aarch64/lib -lts"
export PKG_CONFIG_PATH=/opt/tslib-aarch64/lib/pkgconfig:$PKG_CONFIG_PATH

弄完以上步骤相当于已经安装并且配置了tslib库,但是我再次交叉编译QT源码又报了同样的错误。接下来自己探索了一番,最后生成了一份修复脚本,可以创建一个fix-tslib-detection.sh脚本,内容为:

bash 复制代码
#!/bin/bash

echo "修复tslib检测问题..."

# 1. 设置环境变量
export PKG_CONFIG_PATH=/opt/tslib-aarch64/lib/pkgconfig:$PKG_CONFIG_PATH
export TSLIBDIR=/opt/tslib-aarch64

# 2. 验证tslib安装
echo "=== 检查tslib安装 ==="
if [ ! -f "/opt/tslib-aarch64/lib/libts.so" ]; then
    echo "错误: tslib未正确安装"
    exit 1
fi

if [ ! -f "/opt/tslib-aarch64/include/tslib.h" ]; then
    echo "错误: tslib头文件未找到"
    exit 1
fi

# 3. 验证pkg-config
echo "=== 检查pkg-config ==="
pkg-config --exists tslib
if [ $? -ne 0 ]; then
    echo "创建tslib.pc文件..."
    sudo mkdir -p /opt/tslib-aarch64/lib/pkgconfig
    cat << 'EOF' | sudo tee /opt/tslib-aarch64/lib/pkgconfig/tslib.pc
prefix=/opt/tslib-aarch64
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: tslib
Description: Touchscreen Library
Version: 1.22
Libs: -L${libdir} -lts
Cflags: -I${includedir}
EOF
fi

# 4. 测试编译
echo "=== 测试编译 ==="
cat > /tmp/test_tslib.cpp << 'EOF'
#include <tslib.h>
int main() { return 0; }
EOF

aarch64-linux-gnu-g++ /tmp/test_tslib.cpp -I/opt/tslib-aarch64/include -L/opt/tslib-aarch64/lib -lts -o /tmp/test_tslib 2>/dev/null

if [ $? -eq 0 ]; then
    echo "✓ tslib编译测试通过"
    rm -f /tmp/test_tslib.cpp /tmp/test_tslib
else
    echo "✗ tslib编译测试失败"
    exit 1
fi

echo "修复完成!现在重新配置QT..."

给这个脚本加上可执行权限chomod +x fix-tslib-detection.sh,然后./fix-tslib-detection.sh执行,执行完毕后显示✓ tslib编译测试通过。

最后再次重新配置QT。

bash 复制代码
# 清理之前的配置
cd /home/shichenyang/qt-everywhere-src-5.15.8/qt5-build
rm -f .qmake.super .qmake.cache

# 设置环境
export PKG_CONFIG_PATH=/opt/tslib-aarch64/lib/pkgconfig:$PKG_CONFIG_PATH
export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++

# 重新配置(不要用 -tslib 选项)
../configure \
    -prefix /opt/qt5-aarch64 \
    -opensource \
    -confirm-license \
    -release \
    -xplatform linux-aarch64-gnu-g++ \
    -nomake examples \
    -nomake tests \
    -no-opengl \
    -I/opt/tslib-aarch64/include \
    -L/opt/tslib-aarch64/lib \
    -skip qtwebengine \
    -skip qtmultimedia \
    -v

注意这个,对应自己的交叉编译工具链版本

最终显示以下界面表示配置成功:

关键点:不要使用 -tslib 选项,QT的自动检测通常足够。主要问题是确保 PKG_CONFIG_PATH 正确设置,让pkg-config能找到tslib。

编译和安装

bash 复制代码
//编译,通常需要两个小时左右,耐心等待...
make -j$(nproc)
bash 复制代码
//安装
sudo make install

编译完成!!!

3 QT库文件移植至ARMLinux平台

首先将已经安装好的QT库文件移动到全志H616的平台上,确保H616平台开机并处在 /usr/local/qt/lib/ 路径下(没有可以新建),然后使用以下命令将QT库文件拷贝到H616平台上。

bash 复制代码
scp /opt/qt5-aarch64/lib/lib* orangepi@yourARMip:./

4 Ubuntu上交叉编译程序源代码

我们需要先在Ubuntu上使用交叉编译工具链编译好源程序,再将编译好的程序放到ARM上运行。

首先,创建Makefle工程目录

然后将项目所有的.cpp .h .qrc .png .ui 文件全部复制到/project/arm-qt/的路径下。

接着依次执行命令/opt/qt5-aarch64/bin/qmake -project/opt/qt5-aarch64/bin/qmakemake,构建项目并交叉编译。

然后我发现有错误。。。呜呜呜

接着网上翻博客翻了半天,尝试了很多方法,最后deepseek给了我答案,说是往.pro文件里加一行

加了以后,再次make进行编译,成功!!!

编译完以后将生成的工程拷贝至ARMLinux平台。

5 移植编译好的可执行程序到ARMLinux平台并运行

在全志H616的ARMLinux平台上进入工程,执行 ./arm-qt 即可运行项目。(注意,想要看到可视化界面需要将开发板插上显示器和键盘,在可视化界面调起命令行窗口执行以下命令)

6 运行效果(分为Windows,Ubuntu虚拟机,ARMLinux三个平台)

7 总结

整个流程漫长且繁琐,我用了两天一夜,这对于小白本人来说已经很快了,而且在配置的每一步中经常会出现奇怪的报错,而且报错内容因人而异,以上仅仅是我个人配置过程中遇到的问题,但是不要害怕,对照报错原因一步一步排查,一点一点解决最终也是可以跑出来的,积累的问题和解决方案希望可以帮到大家。经过这个过程,我体会到每个应用底层源码的庞大,这是一代代人用智慧和心血铸就的,光编译QT源码就用了一下午时间,可见代码量的庞大,这更让我体会到我们当今学习计算机的每一个人都是站在巨人的肩膀上去进一步去改造世界。

相关推荐
派大星爱吃猫2 小时前
C++隐藏的this指针(详解)
c++·this指针
虾..2 小时前
C++ 哈希
开发语言·c++·哈希算法
liu****2 小时前
14.日志封装和线程池封装
linux·开发语言·c++
将编程培养成爱好3 小时前
C++ 设计模式《统计辅助功能》
开发语言·c++·设计模式·访问者模式
一匹电信狗4 小时前
【C++】封装红黑树实现map和set容器(详解)
服务器·c++·算法·leetcode·小程序·stl·visual studio
byxdaz5 小时前
Qt中日期/时间/时区类 (QDate, QTime, QDateTime,QTimeZone)
qt·时间·时区
wxin_VXbishe6 小时前
springboot在线课堂教学辅助系统-计算机毕业设计源码07741
java·c++·spring boot·python·spring·django·php
夕泠爱吃糖6 小时前
template关键字
开发语言·c++·template
mit6.8246 小时前
[Avoid-MPC] AvoidanceStateMachine | `Step`心跳函数 | Callback设计
c++