1.准备工作(安装QT,下载交叉编译工具,下载源码)

一 ,安装Qt

下载安装包地址:Qt5.12.9https://download.qt.io/archive/qt/5.12/5.12.9/qt-opensource-linux-x64-5.12.9.run这是官网下载地址,需要梯子访问,推荐复制链接到迅雷下载(非常快)

二 ,下载编译工具

交叉编译工具下载地址:Linaro Releases

下载解压/opt目录下,后修改文件/etc/profile,添加交叉编译工具路径

三 ,下载QT源码

下载地址:qt-everywhere-src-5.12.9.tar.xzhttps://download.qt.io/archive/qt/5.12/5.12.9/single/qt-everywhere-src-5.12.9.tar.xz

2.编写config脚本执行命令创建make(配置编译Qt源码编译方案)

方式一、选择只编译Qt的基础模块(主讲源码完整编译)

源码目录下有一个qtbase目录,该目录是Qt的基础模块目录,

该目录下同样有configure文件(在源码目录下也有一个configure配置文件,这两个文件不一样)

当我们在Qt源码目录下执行./configure命令时,可以配置整体编译方案,我们则可以在此处设置

想要编译构建的参数和模块。在/qtbase目录下,执行./configure命令时,配置的是在该目录下的Qt基本模块

只编译构建qtbase,开发运行常见窗体应用是可以的

目录下新建文件autoconfigure.sh,输入以下内容构建脚本

#!/bin/sh
./configure \
    -prefix /home/XXX/Downloads/qt-everywhere-src-5.14.1/arm-qt \
    -confirm-license \
    -opensource \
    -shared \
    -release \
    -make libs \
    -xplatform linux-arm-gnueabi-g++ \
    -optimized-qmake \
    -pch \
    -qt-libjpeg \
    -qt-libpng \
    -qt-zlib \
    -skip qtdeclarative \
    -no-opengl \
    -no-sse2 \
    -no-openssl \
    -no-cups \
    -no-glib \
    -no-dbus \
    -no-xcb \
    -no-separate-debug-info \
    -no-fontconfig \
    -nomake examples -nomake tools -nomake tests -no-iconv
exit

-prefix:该参数用于指定Qt编译完成后安装时的输出目录。

-xplatform:用于交叉编译时选择目标mkspec。(需与qtbase/mkspec目录下的目录名称一样)

编辑qt源码目录下qtbase/kspecs/linux-arm-gnueabi-g++下的 qmake.conf。注意: mkspecs 下有很多平台选择,说明了 Qt 是跨平台的。之所以是选择 linux-arm-gnueabi-g++,这是因为前面autoconfigure.sh里的参数-xplatform 选择了 linux-arm-gnueabi-g++,具体操作在方式二里操作相同

方式二、完整编译Qt源码

1.配置autoconfigure.sh文件

完整编译Qt源码指的是在Qt源码路径下进行编译,使用configure对Qt进行编译配置时指定需要编译的模块,在源码目录下新建文件autoconfigure.sh,输入以下内容

#! /bin/sh
./configure -prefix /home/linux/work/qt-everywhere-src-5.12.9/arm-qt \  #编译安装的目录路径  
-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/Qt/tslib-1.21/arm-tslib/include \ 
-L/home/Qt/tslib-1.21/arm-tslib/lib \ 
-recheck-all

I/home/linux/work/tslib/arm-tslib/include \

-L//home/linux/work/tslib/arm-tslib/lib \

这个是嵌入式触摸屏的开源库,需要放我们自己编译的后Tslib库的路径(也可叫不加放到这里一起编译了)

 编译Tslib

1 获取 tslib

本文使用的是tslib-1.21

将tslib-1.21.tar.bz2解压

sudo tar -jxvf tslib-1.21.tar.bz2

1.2 配置 tslib

先安装 automake 工具

sudo apt-get install autoconf automake libtool

配置源码生成 Makefile

./autogen.sh

1.3 配置交叉编译工具

新建一个文件夹,用于存放编译输出的内容,在当前目录下新建,执行下面的指令

mkdir arm-tslib

获取路径

指定交叉编译工具与输出路径指令为

.

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

这里的的arm-linux-gnueabihf 与-cache-file=arm-linux要与我们配置交差编译器名称相同

我的名称就是arm-none-linux-gnueabi,所以改为:

./configure --host=arm-none-linux-gnueabi ac_cv_func_malloc_0_nonnull=yes --cache-file=arm-none-linux.cache -prefix=/home/linux/work/tslib/arm-tslib

1.4 编译与安装

执行make编译

make -j2 //加参数-j2 是最多允许 2 条编译指令同时进行

编译完成

执行 make install 指令进行安装

make install

安装完成

将配置好的autoconfigure.sh文件添加可执行权限

2.配置qmake.conf文件

编辑qt源码目录下qtbase编辑 mkspecs/linux-arm-gnueabi-g++下的 qmake.conf

#
# qmake configuration for building with arm-linux-gnueabi-g++
#

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

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

#20250305 song
QT_QPA_DEFAULT_PLATFORM = linuxfb
#该配置指定了Qt使用Linux Framebuffer(LinuxFB)作为默认的图形后端,适用于无X服务器或硬件加速的嵌入式环境。
#LinuxFB直接操作帧缓冲设备实现图形输出,需确保设备节点(如/dev/fb0)存在且权限正常

QMAKE_CFLAGS += -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard
QMAKE_CXXFLAGS += -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard
#-O2:启用二级优化,提升代码执行效率。
#-march=armv7-a:指定目标CPU架构为ARMv7-A系列。
#-mtune=cortex-a7:针对Cortex-A7内核进行指令调度优化。
#-mfpu=neon:启用NEON SIMD指令集加速图形和信号处理。
#-mfloat-abi=hard:使用硬件浮点运算(需CPU支持VFPv3-D16)。

#改为下载的交叉编译器目录


# modifications to g++.conf
QMAKE_CC                = /opt/arm-2014.05/bin/arm-linux-gnueabihf-gcc
QMAKE_CXX               = /opt/arm-2014.05/bin/arm-linux-gnueabihf-g++
QMAKE_LINK              = /opt/arm-2014.05/bin/arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB        = /opt/arm-2014.05/bin/arm-linux-gnueabihf-g++

# modifications to linux.conf
QMAKE_AR                = /opt/arm-2014.05/bin/arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY           = /opt/arm-2014.05/bin/arm-linux-gnueabihf-objcopy
QMAKE_NM                = /opt/arm-2014.05/bin/arm-linux-gnueabihf-nm -P
QMAKE_STRIP             = /opt/arm-2014.05/bin/arm-linux-gnueabihf-strip

QMAKE_INCDIR += /home/linux/work/tslib/arm-tslib/include
QMAKE_LIBDIR += /home/linux/work/tslib/arm-tslib/lib
load(qt_config)
3.执行 autoconfigure.sh 配置

这里遇到一个几个大坑在执行autoconfigure.sh时要注意文件的编码格式,最好保存为UTF-8格式不然报错

还有openGL模块要在autoconfigure.sh配置-no-opengl不然报错

出现Just run make构建成功

3.执行make编译

报错在交叉编译目录下没有 gun/stubs-hard文件,我们在qmake.conf文件里指定了-mfloat-abi=hard:使用硬件浮点运算,可是我的目录下没有这个文件,原因是我使用交叉编译器是arm-linux-guneabi他是不带这个文件夹的

具体链接

解决方法在qmake.conf去掉-mfloat-abi=hard

继续make成功编译

4.执行 make install 安装

5.安装结果

6.在Qt Creator添加交叉编译,创建套件

ubuntu搭建qt交叉编译环境_qt交叉编译环境搭建_²º²²এ松的博客-CSDN博客

7.完成搭建

构建套件完成

构建交叉编译程序生成成功

参考文章:

  1. armlinux 移植qt
  2. ubuntu搭建qt交叉编译环境
  3. 将qt程序交叉编译到arm架构上香奈儿的技术博客_51CTO博客
  4. ubuntu搭建qt的arm交叉编译环境_qt交叉编译环境搭建-CSDN博客
  5. Ubuntu QT 交叉编译环境搭建_qt交叉编译环境搭建-CSDN博客
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐