Ubuntu交叉编译用于STM32MP157的QT6

内容分享7天前发布
3 0 0

环境

宿主: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库。

© 版权声明

相关文章

暂无评论

none
暂无评论...