环境
宿主:Ubuntu 24.04(WSL)
开发板:正点原子STM32MP157
ST官方SDK:en.SDK-x86_64-stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24
SDK来源: 正点原子官网提供的资料中有
QT版本: 6.9.1
准备
-
文中展示的
/path/to/需要替换为你的路径 -
从QT官方或者国内镜像下载用于宿主的QT Linux在线安装器
-
下载完成后设置安装器的权限,然后运行。笔者这里使用了中科大的镜像加速
chmod +x qt-unified-linux-x64-online.run ./qt-unified-linux-x64-online.run --mirror https://mirrors.ustc.edu.cn/qtproject -
使用在线安装器安装6.9.1(记得勾选source组件)的宿主版本并进行测试,确保QT在宿主上可用。最终笔者的安装路径位于
~/Qt/6.9.1/gcc_64, 而源码则位于~/Qt/6.9.1/Src -
解压并安装ST官方SDK,最终路径应该位于
/opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24
步骤
交叉编译环境初始化
运行ST官方的SDK环境脚本在宿主系统上配置交叉编译环境
source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
ST官方的SDK环境中包含的cmake版本低于QT6编译所需的最低版本要求,可以将SDK环境中 的cmake执行文件重命名为其他名字,然后将宿主系统中的cmake程序使用ln命令链接替换SDK环境中的cmake文件
// 进入SDK环境,CMake所在目录
cd /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/sysroots/x86_64-ostl_sdk-linux/usr/bin
// 备份旧的cmake
mv ./cmake ./cmake_old
// 将Ubuntu中的新版本的cmake链接到这里替换
ln -s /usr/bin/cmake ./cmake
使用cmake --version检查cmake版本,确保cmake版本高于
编译配置
在/path/to/Src下创建一个autoconfigure.sh脚本
#!/bin/sh
../configure -prefix ~/Qt/6.9.1/stm32mp1
-xplatform linux-arm-gnueabi-g++
-no-pch
-release
-optimized-qmake
-qt-host-path ~/Qt/6.9.1/gcc_64
-nomake examples
-nomake tests
-skip qtwayland -skip qt5compat -skip qtwebengine -skip qtwebview
-skip qt3d -skip qtquick3d -skip qtquick3dphysics -skip qtdatavis3d -skip qtcanvas3d -skip qtgraphs
-skip qtgrpc -skip qtdoc -skip qtactiveqt -skip qtopcua
-opengl es2
-DQT_FEATURE_egl=ON -DQT_FEATURE_opengl=ON
--
-DCMAKE_TOOLCHAIN_FILE=toolchains/stm32mp157.cmake
exit
笔者编译的版本跳过了3d部分和其他不需要的模块,读者可以自行决定是否需要编译这些模块。
其中-DCMAKE_TOOLCHAIN_FILE=toolchains/stm32mp157.cmake位于/path/to/Src/toolchains/stm32mp157.cmake,内容如下
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
# 可选的,实则已经由SDK环境初始化了
# set(CMAKE_C_COMPILER arm-none-linux-gnueabi-gcc)
# set(CMAKE_CXX_COMPILER arm-none-linux-gnueabi-g++)
# 笔者在编译过程中出现了找不到某些库的错误,因此此处强制设置了SDK的路径
set(CMAKE_SYSROOT /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi)
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
# 设置GLES2_INCLUDE_PATH和GLES2_LIBRARY
set(GLES2_INCLUDE_PATH ${CMAKE_SYSROOT}/usr/include/GLES2)
set(GLES2_LIBRARY ${CMAKE_SYSROOT}/usr/lib/libGLESv2.so)
# 让CMake从CMAKE_SYSROOT查找而不是其他位置
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
修改qtmultimedia模块(不编译则跳过)
如果需要编译qtmultimedia模块,第一打开QT源码的文件
/path/to/Src/qtmultimedia/src/plugins/multimedia/ffmpeg/qffmpegcodec_p.h
修改文件中的
extern "C" {
#include <libavcodec/codec.h>
}
替换为
extern "C" {
#include <libavcodec/avcodec.h>
}
笔者在ST SDK中的ffmpeg没有找到codec.h这个文件,因此此处直接替换为avcodec.h
编译
进入Qt源码路径,然后创建一个build目录并进入
cd ~/Qt/6.9.1/Src
mkdir ./build && cd build
给autoconfigure.sh设置权限后运行
sudo chmod +777 ../autoconfigure.sh
../autoconfigure.sh
如果配置期间出现错误,请检查你的步骤是否出错,或者问问AI。
在配置完成后就可以运行
cmake --build . --parallel
编译速度由机器决定,注意的是如果编译过程出错,则有可能是系统内存不足,一般编译QT6应该有20GB以上的内存,可以思考通过增加Ubuntu的交换文件大小来临时增加系统内存,不过你依旧可以在因内存不足导致编译失败时重复运行cmake --build . --parallel直到编译进度达到100%。
一旦编译结束,祝贺你,你已经编译好了一份用于STM32MP157的QT6,目前你可以使用ninja --install 将编译好的QT安装至configure脚本指定的位置,在笔者之前的autoconfigure.sh中,安装命令将会在~/Qt/6.9.1/stm32mp1处安装这份编译好的QT6库。


