1561|2

185

帖子

3

TA的资源

一粒金砂(高级)

楼主
 

【米尔 NXP i.MX93 开发板评测】搭建QT交叉编译环境 [复制链接]

本帖最后由 小麦克 于 2024-8-27 10:14 编辑

QT交叉编译环境

需要提前安装好cmake和ninja

  1. sudo apt install cmake
  2. sudo apt install ninja-build

基于Yocto编译环境

关于Yocto环境,米尔专门提供了一篇教程《MYD-LMX9X+QT开发指南.pdf》,里面写的很详细了,我这里就不重复了,有两个地方需要注意一下。

MYD-LMX9X+QT开发指南.pdf

(1.98 MB, 下载次数: 1)

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

  1. set(QT_HOST_PATH /home/bruce/Qt/6.5.3/gcc_64)

重新配置后成功了

编译上传测试程序到开发板测试。

buildroot环境

由于我们之前的根文件系统都是基于buildroot,下面来看看怎么在buildroot构建的系统上面配置QT的交叉编译环境。

构建SDK

确保配置的buildroot构建成功,能成功打包成文件系统。下面是我的配置文件(基于当前最新的buildroot仓库-2024-08-27)

  1. BR2_aarch64=y
  2. BR2_cortex_a55=y
  3. BR2_ARM_FPU_VFPV4D16=y
  4. BR2_KERNEL_HEADERS_6_1=y
  5. BR2_PACKAGE_GLIBC_UTILS=y
  6. BR2_TOOLCHAIN_BUILDROOT_CXX=y
  7. BR2_PACKAGE_HOST_GDB=y
  8. BR2_ENABLE_DEBUG=y
  9. BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_MDEV=y
  10. BR2_ROOTFS_MERGED_USR=y
  11. BR2_SYSTEM_DHCP="eth0"
  12. BR2_SYSTEM_DEFAULT_PATH="/bin:/sbin:/usr/bin:/usr/sbin"
  13. BR2_ENABLE_LOCALE_WHITELIST="en_US.UTF-8"
  14. BR2_GENERATE_LOCALE="en_US.UTF-8"
  15. BR2_SYSTEM_ENABLE_NLS=y
  16. BR2_TARGET_TZ_INFO=y
  17. BR2_PACKAGE_ALSA_UTILS=y
  18. BR2_PACKAGE_ALSA_UTILS_ALSACONF=y
  19. BR2_PACKAGE_ALSA_UTILS_ACONNECT=y
  20. BR2_PACKAGE_ALSA_UTILS_ALSALOOP=y
  21. BR2_PACKAGE_ALSA_UTILS_ALSAUCM=y
  22. BR2_PACKAGE_ALSA_UTILS_ALSATPLG=y
  23. BR2_PACKAGE_ALSA_UTILS_AMIDI=y
  24. BR2_PACKAGE_ALSA_UTILS_AMIXER=y
  25. BR2_PACKAGE_ALSA_UTILS_APLAY=y
  26. BR2_PACKAGE_ALSA_UTILS_APLAYMIDI=y
  27. BR2_PACKAGE_ALSA_UTILS_ARECORDMIDI=y
  28. BR2_PACKAGE_ALSA_UTILS_ASEQDUMP=y
  29. BR2_PACKAGE_ALSA_UTILS_ASEQNET=y
  30. BR2_PACKAGE_ALSA_UTILS_BAT=y
  31. BR2_PACKAGE_ALSA_UTILS_IECSET=y
  32. BR2_PACKAGE_ALSA_UTILS_SPEAKER_TEST=y
  33. BR2_PACKAGE_FFMPEG_GPL=y
  34. BR2_PACKAGE_FFMPEG_NONFREE=y
  35. BR2_PACKAGE_FFMPEG_FFPLAY=y
  36. BR2_PACKAGE_FFMPEG_FFPROBE=y
  37. BR2_PACKAGE_FFMPEG_POSTPROC=y
  38. BR2_PACKAGE_FLAC=y
  39. BR2_PACKAGE_GSTREAMER1=y
  40. BR2_PACKAGE_GSTREAMER1_CHECK=y
  41. BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_APP=y
  42. BR2_PACKAGE_GST1_PLUGINS_BAYER2RGB_NEON=y
  43. BR2_PACKAGE_GST1_PLUGINS_GOOD=y
  44. BR2_PACKAGE_GST1_PLUGINS_BAD=y
  45. BR2_PACKAGE_GST1_LIBAV=y
  46. BR2_PACKAGE_GDB=y
  47. BR2_PACKAGE_GDB_SERVER=y
  48. BR2_PACKAGE_GDB_DEBUGGER=y
  49. BR2_PACKAGE_GDB_TUI=y
  50. BR2_PACKAGE_BINUTILS=y
  51. BR2_PACKAGE_BINUTILS_TARGET=y
  52. BR2_PACKAGE_LIBTOOL=y
  53. BR2_PACKAGE_MAKE=y
  54. BR2_PACKAGE_PKGCONF=y
  55. BR2_PACKAGE_TREE=y
  56. BR2_PACKAGE_MMC_UTILS=y
  57. BR2_PACKAGE_BITSTREAM_VERA=y
  58. BR2_PACKAGE_CANTARELL=y
  59. BR2_PACKAGE_DEJAVU=y
  60. BR2_PACKAGE_FONT_AWESOME=y
  61. BR2_PACKAGE_GHOSTSCRIPT_FONTS=y
  62. BR2_PACKAGE_INCONSOLATA=y
  63. BR2_PACKAGE_LIBERATION=y
  64. BR2_PACKAGE_WQY_ZENHEI=y
  65. BR2_PACKAGE_DIRECTFB=y
  66. BR2_PACKAGE_SDL=y
  67. BR2_PACKAGE_SDL_GFX=y
  68. BR2_PACKAGE_SDL_IMAGE=y
  69. BR2_PACKAGE_SDL_IMAGE_GIF=y
  70. BR2_PACKAGE_SDL_IMAGE_JPEG=y
  71. BR2_PACKAGE_SDL_IMAGE_LBM=y
  72. BR2_PACKAGE_SDL_IMAGE_PCX=y
  73. BR2_PACKAGE_SDL_IMAGE_PNG=y
  74. BR2_PACKAGE_SDL_IMAGE_PNM=y
  75. BR2_PACKAGE_SDL_IMAGE_TARGA=y
  76. BR2_PACKAGE_SDL_IMAGE_TIFF=y
  77. BR2_PACKAGE_SDL_IMAGE_WEBP=y
  78. BR2_PACKAGE_SDL_IMAGE_XCF=y
  79. BR2_PACKAGE_SDL_IMAGE_XPM=y
  80. BR2_PACKAGE_SDL_IMAGE_XV=y
  81. BR2_PACKAGE_SDL_MIXER=y
  82. BR2_PACKAGE_SDL_MIXER_MIDI_TIMIDITY=y
  83. BR2_PACKAGE_SDL_NET=y
  84. BR2_PACKAGE_SDL_TTF=y
  85. BR2_PACKAGE_QT6=y
  86. BR2_PACKAGE_QT6BASE_CONCURRENT=y
  87. BR2_PACKAGE_QT6BASE_DBUS=y
  88. BR2_PACKAGE_QT6BASE_VULKAN=y
  89. BR2_PACKAGE_QT6BASE_FONTCONFIG=y
  90. BR2_PACKAGE_QT6BASE_HARFBUZZ=y
  91. BR2_PACKAGE_QT6BASE_GIF=y
  92. BR2_PACKAGE_QT6BASE_JPEG=y
  93. BR2_PACKAGE_QT6BASE_PNG=y
  94. BR2_PACKAGE_QT6BASE_WIDGETS=y
  95. BR2_PACKAGE_QT6BASE_PRINTSUPPORT=y
  96. BR2_PACKAGE_QT6BASE_SYSLOG=y
  97. BR2_PACKAGE_QT6BASE_TEST=y
  98. BR2_PACKAGE_QT6BASE_TSLIB=y
  99. BR2_PACKAGE_QT6CORE5COMPAT=y
  100. BR2_PACKAGE_QT6SERIALBUS=y
  101. BR2_PACKAGE_QT6SVG=y
  102. BR2_PACKAGE_EVEMU=y
  103. BR2_PACKAGE_EVTEST=y
  104. BR2_PACKAGE_KBD=y
  105. BR2_PACKAGE_SYSSTAT=y
  106. BR2_PACKAGE_LIBG7221=y
  107. BR2_PACKAGE_LIBGSM=y
  108. BR2_PACKAGE_LIBILBC=y
  109. BR2_PACKAGE_LIBSAMPLERATE=y
  110. BR2_PACKAGE_OPENCORE_AMR=y
  111. BR2_PACKAGE_PORTAUDIO=y
  112. BR2_PACKAGE_WEBRTC_AUDIO_PROCESSING=y
  113. BR2_PACKAGE_SQLITE_ENABLE_COLUMN_METADATA=y
  114. BR2_PACKAGE_IMLIB2=y
  115. BR2_PACKAGE_IMLIB2_JPEG=y
  116. BR2_PACKAGE_IMLIB2_PNG=y
  117. BR2_PACKAGE_IMLIB2_GIF=y
  118. BR2_PACKAGE_IMLIB2_TIFF=y
  119. BR2_PACKAGE_IMLIB2_ID3=y
  120. BR2_PACKAGE_LIBJPEG=y
  121. BR2_PACKAGE_LIBDRM_INSTALL_TESTS=y
  122. BR2_PACKAGE_LIBFREEIMAGE=y
  123. BR2_PACKAGE_LIBVA=y
  124. BR2_PACKAGE_WAYLAND=y
  125. BR2_PACKAGE_WAYLAND_UTILS=y
  126. BR2_PACKAGE_LIBAIO=y
  127. BR2_PACKAGE_LIBV4L=y
  128. BR2_PACKAGE_LIBV4L_UTILS=y
  129. BR2_PACKAGE_LIBOPENH264=y
  130. BR2_PACKAGE_LIBYUV=y
  131. BR2_PACKAGE_X264=y
  132. BR2_PACKAGE_X264_CLI=y
  133. BR2_PACKAGE_LIBPJSIP=y
  134. BR2_PACKAGE_LIBRSYNC=y
  135. BR2_PACKAGE_LIBUPNP=y
  136. BR2_PACKAGE_LIBCAP=y
  137. BR2_PACKAGE_FMT=y
  138. BR2_PACKAGE_PCRE2_32=y
  139. BR2_PACKAGE_DHCPCD=y
  140. BR2_PACKAGE_FREESWITCH=y
  141. BR2_PACKAGE_FREESWITCH_MOD_BCG729=y
  142. BR2_PACKAGE_OPENSSH=y
  143. BR2_PACKAGE_TCPDUMP=y
  144. BR2_PACKAGE_VSFTPD=y
  145. BR2_PACKAGE_ZSH=y
  146. BR2_PACKAGE_KMOD=y
  147. BR2_PACKAGE_UTIL_LINUX_LIBFDISK=y
  148. BR2_PACKAGE_UTIL_LINUX_AGETTY=y
  149. BR2_PACKAGE_UTIL_LINUX_FSCK=y
  150. BR2_PACKAGE_UTIL_LINUX_HWCLOCK=y
  151. BR2_PACKAGE_UTIL_LINUX_KILL=y
  152. BR2_PACKAGE_UTIL_LINUX_LSFD=y
  153. BR2_PACKAGE_UTIL_LINUX_MORE=y
  154. BR2_PACKAGE_UTIL_LINUX_MOUNT=y
  155. BR2_PACKAGE_UTIL_LINUX_SULOGIN=y
  156. BR2_TARGET_ROOTFS_EXT2=y
  157. BR2_TARGET_ROOTFS_EXT2_SIZE="512M"
  158. BR2_TARGET_ROOTFS_TAR_GZIP=y
  159. BR2_PACKAGE_HOST_ENVIRONMENT_SETUP=y

构建SDK,构建成功后,在output/images文件夹下会生成 aarch64-buildroot-linux-gnu_sdk-buildroot.tar.gzSDK,这个SDK可以拷贝到其他电脑或者其他目录,进行应用开发。

我这里拷贝到/home/bruce/Documents文件夹下,解压,重定位

  1. # 解压
  2. tar -xf aarch64-buildroot-linux-gnu_sdk-buildroot.tar.gz
  3. # 重定位(只需要执行一次)
  4. cd aarch64-buildroot-linux-gnu_sdk-buildroot/
  5. ./relocate-sdk.sh

生成新的QT配置,C和C++编译器配置

QT Versions配置,有红色的错误,不用管。

Devices配置

上面都配置好后,最后配置一下Kits,添加一个imx93的配置项。注意Sysroot的位置

新建一个CMake QT测试程序,配置为imx93,编译,成功!

如果不使用Qt Creatorbuildroot还为我们准备了environment-setup脚本,需要交叉编译的时候直接source一下,一切就准备就绪了。看下面的示例

  1. source ~/Documents/aarch64-buildroot-linux-gnu_sdk-buildroot/environment-setup
  2. # 进入qt app目录编译
  3. bruce@ubuntu:~/Documents/qt/qt-apps/test-app/build$ cmake ..
  4. -- The CXX compiler identification is GNU 13.3.0
  5. -- Detecting CXX compiler ABI info
  6. -- Detecting CXX compiler ABI info - done
  7. -- Check for working CXX compiler: /home/bruce/Documents/aarch64-buildroot-linux-gnu_sdk-buildroot/bin/aarch64-buildroot-linux-gnu-g++ - skipped
  8. -- Detecting CXX compile features
  9. -- Detecting CXX compile features - done
  10. -- Performing Test CMAKE_HAVE_LIBC_PTHREAD
  11. -- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
  12. -- Found Threads: TRUE
  13. -- Performing Test HAVE_STDATOMIC
  14. -- Performing Test HAVE_STDATOMIC - Success
  15. -- Found WrapAtomic: TRUE
  16. -- Configuring done (1.2s)
  17. -- Generating done (0.0s)
  18. -- Build files have been written to: /home/bruce/Documents/qt/qt-apps/test-app/build
  19. bruce@ubuntu:~/Documents/qt/qt-apps/test-app/build$ make
  20. [ 0%] Built target test-app_autogen_timestamp_deps
  21. [ 16%] Automatic MOC and UIC for target test-app
  22. [ 16%] Built target test-app_autogen
  23. [ 33%] Building CXX object CMakeFiles/test-app.dir/test-app_autogen/mocs_compilation.cpp.o
  24. [ 50%] Building CXX object CMakeFiles/test-app.dir/main.cpp.o
  25. [ 66%] Building CXX object CMakeFiles/test-app.dir/mainwindow.cpp.o
  26. [ 83%] Linking CXX executable test-app
  27. [100%] Built target test-app
  28. bruce@ubuntu:~/Documents/qt/qt-apps/test-app/build$ ls
  29. CMakeCache.txt CMakeFiles cmake_install.cmake Makefile test-app test-app_autogen
  30. bruce@ubuntu:~/Documents/qt/qt-apps/test-app/build$ file test-app
  31. 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开发的几种方式都做了测试,欢迎大家指正补充~

最新回复

i.MX93没有GPU,不支持opengl,开发的时候有点不方便的   详情 回复 发表于 2024-8-28 07:27
点赞 关注
 

回复
举报

7023

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

i.MX93没有GPU,不支持opengl,开发的时候有点不方便的

点评

和定位有关,工业应用。普通的QT UI应用没问题的,适配了DRM,也能高清显示,最高可达1080p60,一般场景足够了。  详情 回复 发表于 2024-8-28 10:18
 
 

回复

185

帖子

3

TA的资源

一粒金砂(高级)

板凳
 
Jacktang 发表于 2024-8-28 07:27 i.MX93没有GPU,不支持opengl,开发的时候有点不方便的

和定位有关,工业应用。普通的QT UI应用没问题的,适配了DRM,也能高清显示,最高可达1080p60,一般场景足够了。

 
 

回复
您需要登录后才可以回帖 登录 | 注册

猜你喜欢
随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 15

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表