Ubuntu QT 交叉编译环境搭建(超级详细)
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.完成搭建
构建套件完成
构建交叉编译程序生成成功
参考文章:
- armlinux 移植qt
- ubuntu搭建qt交叉编译环境
- 将qt程序交叉编译到arm架构上香奈儿的技术博客_51CTO博客
- ubuntu搭建qt的arm交叉编译环境_qt交叉编译环境搭建-CSDN博客
- Ubuntu QT 交叉编译环境搭建_qt交叉编译环境搭建-CSDN博客