Cross-Compile QT6.5.0 for X3Pi

这篇具有很好参考价值的文章主要介绍了Cross-Compile QT6.5.0 for X3Pi。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 . 交叉编译Qt6.5.0

  • 参考1
  • 参考2
  • 参考3Cross-Compile Qt 6 for Raspberry Pi
  • 参考4
  • 给一个设备交叉编译Qt需要以下两个工具:
    • toolchain
      • 包含编译器、头文件和相关的库
    • sysroot
      • 包含目标系统的头文件和库,允许在主机上编译、链接库和应用程序。

1.1 使用源码编译cmake

  • 参考2
sudo apt install libssl-dev
git clone https://github.com/Kitware/CMake.git
cd CMake
./bootstrap && make && sudo make install

1.2 安装 Node.js (14或以上)和 npm

  • 参考

1.3 Host安装依赖包和编译Qt

1.3.1 依赖包

# 安装依赖包
sudo apt-get install make build-essential libclang-dev ninja-build gcc git bison python3 gperf pkg-config libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libatspi2.0-dev libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev

# Qt TextToSpeech
sudo apt install libspeechd-dev flite1-dev libasound2-dev

# multimedia
sudo apt install libavcodec-dev libavformat-dev libavfilter-dev libavdevice-dev

# bluetooth
sudo apt install libpcsclite-dev libbluetooth-dev

#/usr/include/gnu/stubs.h:7:27: fatal error: gnu/stubs-32.h: No such file or directory
sudo apt-get install libc6-dev-i386 

1.3.2 cmake

cmake ../qt-everywhere-src-6.5.0/ -GNinja \
-DCMAKE_BUILD_TYPE=Release \
-DQT_BUILD_EXAMPLES=OFF \
-DQT_BUILD_TESTS=OFF \
-DCMAKE_INSTALL_PREFIX=/home/am/installed/qt6-host \
--log-level=VERBOSE

1.3.3 编译和安装

cmake --build . --parallel 8
cmake --install .

1.4 Target安装依赖包和编译Qt

1.4.1 升级系统

sudo apt update
sudo apt upgrade
sudo reboot

1.4.2 查找指定文件属于哪个包

dpkg-query --search /usr/include/brotli/decode.h

1.4.3 pkg-config检查dbus-1是否安装

pkg-config --libs --cflags dbus-1

1.4.4 安装裁剪完整依赖包

sudo apt install -y libboost1.71-all-dev libudev-dev libinput-dev libts-dev \
libmtdev-dev libjpeg-dev libfontconfig1-dev libssl-dev libdbus-1-dev \
libglib2.0-dev libpulse-dev libsnappy-dev libnss3-dev flex bison libxslt-dev \
ruby gperf libbz2-dev libcups2-dev libfreetype6-dev libicu-dev libsqlite3-dev \
libavcodec-dev libavformat-dev libavfilter-dev libavdevice-dev  libswscale-dev \
libspeechd-dev flite1-dev libasound2-dev libpcsclite-dev libbluetooth-dev \
libxcursor-dev libxcomposite-dev libaudio-dev rsync libbrotli-dev libxrandr-dev

1.4.5 安装完整依赖包

# 安装依赖包1
sudo apt-get install libboost-all-dev libudev-dev libinput-dev libts-dev libmtdev-dev libjpeg-dev libfontconfig1-dev libssl-dev libdbus-1-dev libglib2.0-dev libxkbcommon-dev libegl1-mesa-dev libgbm-dev libgles2-mesa-dev mesa-common-dev libasound2-dev libpulse-dev gstreamer1.0-omx libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev  gstreamer1.0-alsa libvpx-dev libsrtp2-dev libsnappy-dev libnss3-dev "^libxcb.*" flex bison libxslt-dev ruby gperf libbz2-dev libcups2-dev libatkmm-1.6-dev libxi6 libxcomposite1 libfreetype6-dev libicu-dev libsqlite3-dev libxslt1-dev

# 安装依赖包2
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libx11-dev freetds-dev libsqlite3-dev libpq-dev libiodbc2-dev firebird-dev libgst-dev libxext-dev libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-sync1 libxcb-sync-dev libxcb-render-util0 libxcb-render-util0-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-glx0-dev libxi-dev libdrm-dev libxcb-xinerama0 libxcb-xinerama0-dev libatspi2.0-dev libxcursor-dev libxcomposite-dev libxdamage-dev libxss-dev libxtst-dev libpci-dev libcap-dev libxrandr-dev libdirectfb-dev libaudio-dev libxkbcommon-x11-dev

# 安装TTS Engine
sudo apt install libspeechd-dev flite pulseaudio libpulse-dev osspd
# 安装rsync用于与Host执行rsync
sudo apt install -y rsync
# 删除不需要的包
sudo apt remove libzstd-dev libharfbuzz-bin libharfbuzz-dev

1.4.6 把sysroot从Target同步到Host

  • 同步示例:
rsync -avz --rsync-path="sudo rsync" --delete pi@192.168.1.7:/usr/lib sysroot/usr
  • The –rsync-path=“sudo rsync” option allows us to access files on the target system that may require elevated rights.
  • The –delete option will delete any files from our host system if they have also been deleted on the target system.
# create sysroot
mkdir /home/am/nfs/sysroot; mkdir /home/am/nfs/sysroot/usr
cd /home/am/nfs

#  rsync system files from target to PC
rsync -avz root@192.168.1.12:/lib sysroot
rsync -avz root@192.168.1.12:/usr/include sysroot/usr
rsync -avz root@192.168.1.12:/usr/lib sysroot/usr
# or
rsync -avz --rsync-path="sudo rsync"  root@192.168.1.12:/lib sysroot
rsync -avz --rsync-path="sudo rsync"  root@192.168.1.12:/usr/include sysroot/usr
rsync -avz --rsync-path="sudo rsync"  root@192.168.1.12:/usr/lib sysroot/usr
  • 同步符号链接
sudo apt install symlinks
symlinks -rc sysroot

文章来源地址https://www.toymoban.com/news/detail-687425.html

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
sudo chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

1.4.7 cmake

cmake ../qt-everywhere-src-6.5.0/ -GNinja \
-DCMAKE_BUILD_TYPE=Release \
-DQT_BUILD_EXAMPLES=OFF \
-DQT_BUILD_TESTS=OFF \
-DQT_HOST_PATH=$HOME/installed/qt6-host \
-DCMAKE_STAGING_PREFIX=$HOME/installed/qt6-x3 \
-DCMAKE_INSTALL_PREFIX=/usr/local/qt6-x3 \
-DCMAKE_TOOLCHAIN_FILE=$HOME/tools/toolchain.cmake \
-DQT_QMAKE_TARGET_MKSPEC=linux-aarch64-gnu-g++ \
-DFEATURE_optimize_size=ON \
-DINPUT_opengl=no \
-DFEATURE_linuxfb=ON \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_qtwayland=OFF \
-DBUILD_qtwebchannel=OFF \
-DBUILD_qtwebengine=OFF \
-DBUILD_qtwebview=OFF \
-DBUILD_qtdoc=OFF

1.4.8 编译和安装

cmake --build . --parallel 8
cmake --install .

1.4.9 布署Qt到target 板

  • 拷贝Qt安装文件
cd /home/am/install
rsync -avz --rsync-path="sudo rsync" qt6 root@192.168.1.12:/usr/local
  • 更新Linker (以让Targer linker找到Qt库文件)
echo /usr/local/qt5.15.9/lib | sudo tee /etc/ld.so.conf.d/qt5.15.9.conf
sudo ldconfig
  • 修正dbus链接
cd /home/am/installed/sysroot/usr/lib/aarch64-linux-gnu
rm libdbus-1.so
ln -s libdbus-1.so.3.19.11 libdbus-1.so

1.5 编译和运行Qt应用

  • 编译
$ cd /tools/qt-everywhere-src-6.5.0/qtbase/examples/widgets/widgets/analogclock/
$ mkdir build; cd build;
$ qt-cmake ..

### CMake is configuring here. After it is done without any error, we can proceed to build and install it
$ cmake --build . --parallel 4
# or 
$ make

$ cmake --install .
  • 拷贝到板子上运行
$ scp -r analogclock <pi_username>@<pi_ip_address>:/home/pi
$ ssh <pi_username>@<pi_ip_address>

# set running environment
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/qt6/lib
$ export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=1920x1080:mmsize=1920x1080:offset=0x0:nographicsmodeswitch=0

# 解决2个Mouse Cursors, disable lightdm
$ sudo systemctl disable lightdm
# 恢复lightdm
$ sudo dpkg-reconfigure lightdm

$ cd /home/pi
$ ./analogclock

2. 在QtCreator中设置交叉编译环境

  • 在QtCreator中设置交叉编译环境
  • 下载在线安装器安装Qt Creator
    • https://download.qt.io/official_releases/online_installers/
  • 下载Qt Creator安装包
    • https://download.qt.io/official_releases/qtcreator/

2.1 运行

  • 在目标板上找不到工具链中的.so
sudo vim /etc/ld.so.conf.d/toolchain.conf
# 把找不到.so所在的路径copy到上面的toolchain.conf中
sudo ldconfig
  • 设置 QT_QPA_PLATFORM
#错误信息:
#qt.qpa.plugin: Could not find the Qt platform plugin "xcb" in ""
#This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
#Available platform plugins are: linuxfb, minimal, offscreen, vnc.
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=1920x1080:mmsize=1920x1080:offset=0x0:nographicsmodeswitch=0

3. 修改系统配置

3.1 修改静态IP配置

  • 静态网络配置保存在/etc/network/interfaces文件中,通过修改address、netmask、gateway等字段,可完成对静态IP配置的修改
sudo vim /etc/network/interfaces
  • 配置文件内容如下:
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
auto eth0
iface eth0 inet static
    address 192.168.3.100
    netmask 255.255.255.0
    gateway 192.168.3.1 
    metric 700
  • 修改完成后,命令行输入以下命令让配置生效
sudo restart_network

3.2 修改DHCP配置

  • DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。开发板的DHCP网络配置保存在/etc/network/interfaces文件,通过修改eth0相关配置,可完成对DHCP模式的修改
sudo vim /etc/network/interfaces
source-directory /etc/network/interfaces.d
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
    metric 700
  • 修改完成后,命令行输入以下命令让配置生效
sudo restart_network

3.3 修改MAC地址配置

  • 如需修改开发板默认MAC地址,可通过在/etc/network/interfaces文件中增加pre-up配置信息,指定用户需要的MAC地址
sudo vim /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
auto eth0
iface eth0 inet static
    address 192.168.3.100
    netmask 255.255.255.0
    gateway 192.168.3.1 
    pre-up ifconfig eth0 hw ether 00:11:22:9f:51:27
  • 修改完成后,命令行输入以下命令让配置生效
sudo restart_network

3.4 使用命令连接WiFi

  • 扫描热点
sudo nmcli device wifi rescan
  • 列出扫描到的热点
sudo nmcli device wifi list
  • 连接WiFi
sudo wifi_connect "SSID" "PASSWD"

3.5 自启动配置

  • 通过在sudo vim /etc/rc.local文件末尾添加命令,可实现开机自启动功能,例如:
#!/bin/bash -e
# 
# rc.local
#re
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

#!/bin/sh

chmod a=rx,u+ws /usr/bin/sudo
chown sunrise:sunrise /home/sunrise

which "hrut_count" >/dev/null 2>&1
if [ $? -eq 0 ]; then
        hrut_count 0
fi

# Insert what you need
# set usb to host mode
echo host > /sys/devices/platform/soc/b2000000.usb/b2000000.dwc3/role
# set running environment
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/qt6-x3/lib
$ export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=1920x1080:mmsize=1920x1080:offset=0x0:nographicsmodeswitch=0

3.6 查看芯片运行状态

sudo hrut_somstatus

3.7 Ubuntu系统启动顺序

  • 第一步:
init /etc/inittab
  • 第二步:启动相应的脚本,并且打开终端
rc.sysinit
rc.d(里面的脚本)
rc.local
  • 第三步:启动login登录界面 login
  • 第四步:在用户登录的时候执行sh脚本的顺序,每次登录的时候都会完全执行的
/etc/profile.d/file
/etc/profile
/etc/bashrc
/root/.bashrc
/root/.bash_profile

4. 常用工具

4.1 Target与电脑端文件传输

  • 拷贝单文件 local_file 到target /userdata目录下:
scp local_file root@192.168.3.100:/userdata/
  • 拷贝整个文件夹 local_folder 到target /userdata目录下:
scp -r local_folder root@192.168.3.100:/userdata/

4.2 IAR调试信息

  • 查看IAR调试信息:
cat /sys/kernel/debug/iar
  • 输出内容如下:
    Cross-Compile QT6.5.0 for X3Pi,边缘计算,qt

4.4 linuxfb

  • This linuxfb plugin writes directly to the framebuffer. Only software-rendered content is supported. Note that on some setups the display performance is expected to be limited.
  • The linuxfb plugin allows specifying additional settings by passing them in the QT_QPA_PLATFORM environment variable or -platform command-line option. For example, QT_QPA_PLATFORM=linuxfb:fb=/dev/fb1 specifies that the framebuffer device /dev/fb1 must be used instead of the default fb0. Multiple settings can be specified by separating them with a colon.
  • fb=/dev/fbN - Specifies the framebuffer devices. On multiple display setups this typically allows running the application on different displays. For the time being there is no way to use multiple framebuffers from one Qt application.
  • size=<width>x<height> - Specifies the screen size in pixels. The plugin tries to query the display dimensions, both physical and logical, from the framebuffer device. This may not always lead to proper results however, and therefore it may become necessary to explicitly specify the values.
  • mmsize=<width>x<height> - Physical width and height in millimeters.
  • offset=<width>x<height> - Offset in pixels specifying the top-left corner of the screen. The default position is at (0, 0).
  • nographicsmodeswitch - Do not switch the virtual terminal to graphics mode (KD_GRAPHICS). In addition to switching to graphics mode, the blinking cursor and screen blanking are normally disabled too. When this parameter is set, these are also skipped.
  • tty=/dev/ttyN - Overrides the virtual console. Only used when nographicsmodeswitch is not set.

4.5 Target Error

4.5.1 非UTF-8

root@ubuntu:/userdata# ./HelloQt6
Detected locale "C" with character encoding "ANSI_X3.4-1968", which is not UTF-8.
Qt depends on a UTF-8 locale, and has switched to "C.UTF-8" instead.
If this causes problems, reconfigure your locale. See the locale(1) manual
for more information.
  • 解决方案
# 查看支持的编码格式
locale -a
# 解决此问题
export LC_ALL=en_US.UTF-8

参考链接

- [参考1](https://github.com/UvinduW/Cross-Compiling-Qt-for-Raspberry-Pi-4)
- [参考2](https://mechatronicsblog.com/cross-compile-and-deploy-qt-5-12-for-raspberry-pi/)

到了这里,关于Cross-Compile QT6.5.0 for X3Pi的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • windows11下Qt6.5开发环境安装及QT for Android环境搭建(含虚拟机的创建)

    最近想升级Qt6.5及顺便配置Android开发环境。于是在网上找了各种教程,结果在配置Android开发环境都以失败告终。最终花了很长时间才搞掂。接下来分享比较好的安装方法以及安装注意事项。 建议用中科大或清华的镜像下载在线安装器,官网的很慢。链接如下: 下载在线安装

    2024年02月13日
    浏览(46)
  • Qt6中使用Qt Charts

     官方文档:Qt Charts 6.5.2           如果你是使用  CMake 构建的,则应在  CMakeLists.txt  中添加如下两行代码:         其中  mytarget 为你的项目名称。一共2处改动,如下截图:         改完之后,你在 .cpp 文件导入库名,就可以开始画图了。         关于怎么画出一个可

    2024年02月09日
    浏览(31)
  • 【QT教程】QT6物联网应用

    QT6物联网应用 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C++扩展开发视频课程 免费QT视频课程 您可以看免费1000+个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免费QT视

    2024年04月25日
    浏览(26)
  • 【Qt6】QStringList

    2023年10月31日,周二上午 QStringList 是 Qt 中的一个类,用于存储一组字符串。它提供了一些方便的方法来操作和管理字符串列表。 QStringList 可以用于存储任意数量的字符串,并提供了一些常用的操作,例如添加、删除、查找、排序等。它是基于 QStringList 类的 QVectorQString 的封装

    2024年02月06日
    浏览(26)
  • Qt5和Qt6的区别

    Qt4和Qt5的区别 之前有做过将项目从QT4迁移到QT5的操作,所以写了一篇QT4和Qt5的区别。在最近这一年接触过Qt6后,所以想要介绍一下Qt6和Qt5的区别,通过自己的试用感受和结合网上各路大佬的点拨,有了一个大概的了解。 各稳定版本: Qt4: 4.8.7 4.X 系列终结版本 Qt5 : 5.6 LTS 长期

    2024年01月18日
    浏览(44)
  • 【Qt6】嵌套 QWindow

    在上个世纪的文章中,老周简单介绍了 QWindow 类的基本使用——包括从 QWindow 类派生和从 QRasterWindow 类派生。 其实,QWindow 类并不是只能充当主窗口用,它也可以嵌套到父级窗口中,变成子级对象。咱们一般称之为【控件】。F 话不多讲,下面咱们用实际案例来说明。 这个例

    2024年02月02日
    浏览(24)
  • Qt6.2教程——3.Qt信号和槽

    信号和槽是Qt中一个强大的特性,用于处理对象之间的通信。它们是一种事件处理机制,允许一个对象在某个事件发生时通知另一个对象。 定义 : 信号是一个QObject的成员函数,当某个特定事件发生时,它被自动调用。它可以与一个或多个槽关联。 声明 : 在Qt类的声明中,信号

    2024年02月10日
    浏览(35)
  • 一.QT QT6.5快速安装(Windows)

    本文仅适用于初学者参考!!! 如有错误和疑问请指出  点开 下载 打开命令行: 快捷键win+r 输入cmd 输入D:qt-unified-windows-x64-4.5.1-online.exe --mirror https://mirrors.ustc.edu.cn/qtproject(因为我的安装器下在D盘所以开头是D:,其他盘相同)                               

    2023年04月25日
    浏览(31)
  • Qt6教程之一 Qt介绍及准备工作

    在正式开始之前,需要在自己电脑上面搭建好Qt的开发环境,本教程使用的Qt开发环境为Qt6.2 。 那话不多说,咋们开始做准备工作吧! 第一步:查看电脑硬件配置及操作系统 如果有一台较好配置的电脑,那么无疑用起来是最舒心的,推荐的最佳电脑配置: 由于Qt是为跨平台而

    2024年02月09日
    浏览(25)
  • Qt6入门教程 6:Qt元对象系统

    目录 一.什么是Qt元对象系统? 二.编译时Qt Creator偷摸做了哪些事情? 1.uic 2.rcc 3.moc Qt中的元对象系统(Meta-Object System)提供了对象间通信的信号和槽机制、运行时类型信息和动态属性系统。元对象系统是基于以下3个条件的: ●该类必须继承自QObject类; ●必须在类的私有声

    2024年01月18日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包