本帖最后由 小麦克 于 2024-8-27 10:14 编辑
QT交叉编译环境
需要提前安装好cmake和ninja
sudo apt install cmake
sudo apt install ninja-build
基于Yocto编译环境
关于Yocto环境,米尔专门提供了一篇教程《MYD-LMX9X+QT开发指南.pdf》,里面写的很详细了,我这里就不重复了,有两个地方需要注意一下。
Sysroot配置问题
教程中的Sysroot
有点问题,应该为 /opt/fsl-imx-xwayland/6.1-mickledore/sysroots/armv8a-poky-linux
而不是 /opt/fsl-imx-xwayland/6.1-mickledore/sysroots/x86_64-pokysdk-linux
CMake构建失败
上面配置都成功了,开始创建QT应用,如果使用qmake
方式构建应用一切正常。但是如果使用CMake
方式构建,配置阶段为提示错误:To use a cross-compiled Qt, please set the QT_HOST_PATH cache variable to the location of your host Qt installation.
解决方法:需要在CMakeLists.txt
中设置 QT_HOST_PATH
为主机QT的gcc目录,我安装的目录是 /home/bruce/Qt/6.5.3/gcc_64
set(QT_HOST_PATH /home/bruce/Qt/6.5.3/gcc_64)
重新配置后成功了
编译上传测试程序到开发板测试。
buildroot环境
由于我们之前的根文件系统都是基于buildroot
,下面来看看怎么在buildroot
构建的系统上面配置QT的交叉编译环境。
构建SDK
确保配置的buildroot
构建成功,能成功打包成文件系统。下面是我的配置文件(基于当前最新的buildroot仓库-2024-08-27)
构建SDK,构建成功后,在output/images
文件夹下会生成 aarch64-buildroot-linux-gnu_sdk-buildroot.tar.gz
SDK,这个SDK可以拷贝到其他电脑或者其他目录,进行应用开发。
我这里拷贝到/home/bruce/Documents
文件夹下,解压,重定位
tar -xf aarch64-buildroot-linux-gnu_sdk-buildroot.tar.gz
cd aarch64-buildroot-linux-gnu_sdk-buildroot/
./relocate-sdk.sh
生成新的QT配置,C和C++编译器配置
QT Versions配置,有红色的错误,不用管。
Devices配置
上面都配置好后,最后配置一下Kits,添加一个imx93的配置项。注意Sysroot
的位置
新建一个CMake QT测试程序,配置为imx93
,编译,成功!
如果不使用Qt Creator
,buildroot
还为我们准备了environment-setup
脚本,需要交叉编译的时候直接source
一下,一切就准备就绪了。看下面的示例
source ~/Documents/aarch64-buildroot-linux-gnu_sdk-buildroot/environment-setup
bruce@ubuntu:~/Documents/qt/qt-apps/test-app/build$ cmake ..
-- The CXX compiler identification is GNU 13.3.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /home/bruce/Documents/aarch64-buildroot-linux-gnu_sdk-buildroot/bin/aarch64-buildroot-linux-gnu-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE
-- Performing Test HAVE_STDATOMIC
-- Performing Test HAVE_STDATOMIC - Success
-- Found WrapAtomic: TRUE
-- Configuring done (1.2s)
-- Generating done (0.0s)
-- Build files have been written to: /home/bruce/Documents/qt/qt-apps/test-app/build
bruce@ubuntu:~/Documents/qt/qt-apps/test-app/build$ make
[ 0%] Built target test-app_autogen_timestamp_deps
[ 16%] Automatic MOC and UIC for target test-app
[ 16%] Built target test-app_autogen
[ 33%] Building CXX object CMakeFiles/test-app.dir/test-app_autogen/mocs_compilation.cpp.o
[ 50%] Building CXX object CMakeFiles/test-app.dir/main.cpp.o
[ 66%] Building CXX object CMakeFiles/test-app.dir/mainwindow.cpp.o
[ 83%] Linking CXX executable test-app
[100%] Built target test-app
bruce@ubuntu:~/Documents/qt/qt-apps/test-app/build$ ls
CMakeCache.txt CMakeFiles cmake_install.cmake Makefile test-app test-app_autogen
bruce@ubuntu:~/Documents/qt/qt-apps/test-app/build$ file test-app
test-app: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 6.1.0, with debug_info, not stripped
可以看到生成的test-app
就是ARM aarch64
。
这种方式适合自动化,对项目组提交的代码进行自动编译打包或者测试。
树莓派
最近搞了一台8GB的树莓派5,测试下来性能还不错,前提必须上PCI-E固态硬盘,SD卡相对于固态硬盘太慢了。
因为和IMX93使用了同样的aarch64
架构,接上显示器,用来开发原生QT更简单,不需要配置复杂的交叉编译环境。
我这里通过VNC连接到了树莓派5,安装Qt Creator IDE,编译出的程序可以直接放到开发板运行。需要注意的是i.MX93没有GPU,不支持opengl,因此开发的时候不能调用这些库。否则在开发板加载程序会失败。
结论
本篇将QT开发的几种方式都做了测试,欢迎大家指正补充~