栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Qt5 交叉编译 Jetson nano

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Qt5 交叉编译 Jetson nano

1.下载交叉编译工具,Qt15.5.2镜像

https://developer.nvidia.com/embedded/dlc/l4t-gcc-7-3-1-toolchain-64-bit

http://mirrors.ustc.edu.cn/qtproject/archive/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz

2.下载Jetson nano镜像

https://developer.nvidia.com/jetson-nano-sd-card-image

按照官方文档将镜像写入到sd卡,启动Jetson nano

3.在Jetson nano端启用root登陆

sudo passwd root
sudo vi /etc/ssh/sshd_config

#PermitRootLogin prohibit-password    ------> 改为 PermitRootLogin yes

重启Jetson nano使配置可用,IP地址为 192.168.6.104

4.在Jetson nano端下载Qt依赖项

sudo apt update

# qtbase
sudo apt-get install '.*libxcb.*' libboost1.62-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 xcb libxcb-xkb-dev x11-xkb-utils libx11-xcb-dev libxkbcommon-x11-dev libwayland-dev

# qtmultimedia
sudo apt-get install libasound2-dev libpulse-dev gstreamer1.0-omx libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev  gstreamer1.0-alsa

# qtwebengine
sudo apt-get install libvpx-dev libsrtp0-dev libsnappy-dev libnss3-dev


# qtlocation
sudo apt-get install libgeoclue-2-dev libdbus-glib-1-dev libgudev-1.0-dev libbluetooth-dev

5.主机配置

sudo apt-get instal gcc bison python gperf pkg-config
sudo apt-get install make libclang-dev build-essential

解压交叉编译工具,设置环境变量,同步Jetson nano的库文件和头文件

cd /opt
mkdir qt5jnano
chown lc:lc qt5jnano
cd qt5jnano
export PATH=$PATH:/opt/qt5jnano/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin
mkdir sysroot
rsync -avz root@192.168.6.104:/lib sysroot
rsync -avz root@192.168.6.104:/usr/include sysroot/usr
rsync -avz root@192.168.6.104:/usr/lib sysroot/usr

6.使用脚本 sysroot-relativelinks.py 将符号链接设置为相对链接:因为sysroot里面有很多软连接使用的都是绝对路径,那就会直接链接到你PC的/usr、/lib目录里面去,那肯定是错的,我们希望它们链接到sysroot里面对应的库。所以我们需要把绝对路径改成相对路径

cd qt5jnano
wget https://raw.githubusercontent.com/Kukkimonsuta/rpi-buildqt/master/scripts/utils/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

#再执行一遍确保没有丢失的东西
rsync -avz root@192.168.6.104:/lib sysroot
rsync -avz root@192.168.6.104:/usr/include sysroot/usr
rsync -avz root@192.168.6.104:/usr/lib sysroot/usr
./sysroot-relativelinks.py sysroot


#如果下载不了sysroot-relativelinks.py脚本,直接cp下面

#!/usr/bin/env python
import sys
import os

# source: https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py

# Take a sysroot directory and turn all the absolute symlinks and turn them into
# relative ones such that the sysroot is usable within another system.

if len(sys.argv) != 2:
    print("Usage is " + sys.argv[0] + "")
    sys.exit(1)

topdir = sys.argv[1]
topdir = os.path.abspath(topdir)

def handlelink(filePath, subdir):
    link = os.readlink(filePath)
    if link[0] != "/":
        return
    if link.startswith(topdir):
        return
    
    newlink = os.path.relpath(topdir+link, subdir)

    print("t%s replacing %s => %s" % (filePath, link, newlink))
    os.unlink(filePath)
    os.symlink(newlink, filePath)

for subdir, dirs, files in os.walk(topdir):
    for file in files:
        filePath = os.path.join(subdir, file)
        if os.path.islink(filePath):
            handlelink(filePath, subdir)

7.配置Qt编译文件

cp -r qt-everywhere-src-5.15.2/qtbase/mkspecs/devices/linux-jetson-tx1-g++/ qt-everywhere-src-5.15.2/qtbase/mkspecs/devices/linux-jetson-nano-g++

编辑 qt-everywhere-src-5.15.2/qtbase/mkspecs/devices/linux-jetson-nano-g++/qmake.conf

#
# qmake configuration for Jetson TX1 boards running 64-bit Linux For Tegra
# (tested with R24.2, sample root filesystem)
#
# Note that this environment has been tested with X11 only.
#
# A typical configure line might look like the following:
#
# configure 
#   -device linux-jetson-tx1-g++ 
#   -device-option CROSS_COMPILE=/opt/gcc-linaro-5.3.1-2016.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- 
#   -sysroot /opt/Linux_for_Tegra/rootfs
#
# Note that this builds for GLX + OpenGL. To use EGL + OpenGL ES instead, pass
# -opengl es2 and ensure the rootfs has the headers (rootfs/usr/include/EGL,
# GLES2, GLES3), which may not be the case out of the box.
#
# Check the configure output carefully, some features may be disabled due to the
# rootfs not having the necessary dev files.
#
# If getting cryptic linker errors from static libs like libm.a, check that the
# symlinks libm.so, libz.so, etc. under rootfs/usr/lib/aarch64-linux-gnu are not
# broken. If they are, due to using absolute paths, change them so that they are
# relative to rootfs.

include(../common/linux_device_pre.conf)

QMAKE_INCDIR_POST += 
    $$[QT_SYSROOT]/usr/include 
    $$[QT_SYSROOT]/usr/include/aarch64-linux-gnu

QMAKE_LIBDIR_POST += 
    $$[QT_SYSROOT]/usr/lib 
    $$[QT_SYSROOT]/lib/aarch64-linux-gnu 
    $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu

QMAKE_RPATHlinkDIR_POST += 
    $$[QT_SYSROOT]/usr/lib 
    $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu 
    $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu/tegra 
    $$[QT_SYSROOT]/lib/aarch64-linux-gnu

QMAKE_INLUDE_EGL = $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu/tegra-egl

DISTRO_OPTS += aarch64
COMPILER_FLAGS += -mtune=cortex-a57.cortex-a53 -march=armv8-a

# When configured with -opengl es2, eglfs will be functional with its
# dummy fullscreen X11 backend, in addition to xcb.
EGLFS_DEVICE_INTEGRATION = eglfs_x11

include(../common/linux_arm_device_post.conf)
load(qt_config)

8.编译Qt

mkdir qt5build
cd qt5build
../qt-everywhere-src-5.15.2/configure -opengl es2 -device linux-jetson-nano-g++ -device-option CROSS_COMPILE=/opt/qt5jnano/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- -sysroot /opt/qt5jnano/sysroot -prefix /usr/local/qt5jnano -opensource -/confirm/i-license -skip qtscript -skip wayland -skip qtwebengine -force-debug-info -skip qtdatavis3d -skip qtlocation -nomake examples -make libs -pkg-config -no-use-gold-linker -v
make -j8 
make install

9.同步Qt到Jetson nano

rsync -avz sysroot/usr/local/qt5jnano root@192.168.6.104:/usr/local

10.Jetson nano 端配置 /etc/profile

export PATH=$PATH:/usr/local/qt5jnano

# debug 日志
#export QT_DEBUG_PLUGINS=1
#export QT_LOGGING_RULES=qt.qpa.input=true

# eglfs屏幕物理尺寸,单位毫米
export QT_QPA_EGLFS_PHYSICAL_WIDTH=527.04
export QT_QPA_EGLFS_PHYSICAL_HEIGHT=296.46

# eglfs屏幕分辨率
export QT_QPA_EGLFS_WIDTH=1920
export QT_QPA_EGLFS_HEIGHT=1080

export QT_QPA_EGLFS_LAYER_INDEX=2
export QT_QPA_EGLFS_KMS_PLANE_INDEX=1
export QT_QPA_EGLFS_KMS_CONNECTOR_INDEX=0
export QT_QPA_PLATFORM=eglfs
export QT_QPA_EGLFS_INTEGRATION=eglfs_kms_egldevice
export QT_QPA_EGLFS_KMS_ATOMIC=1
export QT_QPA_EGLFS_ALWAYS_SET_MODE=1

#export QT_QPA_EGLFS_HIDECURSOR=1 #是否显示鼠标

# 其他
export QTDIR=/usr/local/qt5jnano
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH # 链接库路径
export QT_QPA_FonTDIR=$QTDIR/lib/fonts
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins/
#export QWS_MOUSE_PROTO=/dev/input/mouse0 # 触摸屏输入设备
export QML_import_PATH=$QTDIR/qml
export QML2_import_PATH=$QTDIR/qml

11.非root模式需要修改 /dev/input/event* 权限才能使用鼠标,键盘事件

sudo chmod 777 /etc/input/event*

12.以root模式制作开机启动服务来运行程序

在 /etc/systemd/system/ 添加服务 linuxMusicplayer.service

[Unit]
Description=linuxMusicplayer
Wants=nvphs.service nvpmodel.service nv-l4t-usb-device-mode.service jetson_stats_boot.service  networking.service NetworkManager.service

[Service]
Type=simple
User=root
WorkingDirectory=/home/test/Desktop/MusicPlayer/bin
ExecStart=/home/test/Desktop/MusicPlayer/bin/MusicPlayer
ExecStop=/bin/cp /home/test/Desktop/MusicPlayer/bin/MusicPlayer.tmp /home/test/Desktop/MusicPlayer/bin/MusicPlayer
Restart=on-failure

[Install]
WantedBy=multi-user.target

由于程序运行需要 root 环境变量,但是服务程序启动时无法使用 root 环境变量。使用 systemctl edit linuxMusicplayer.service 给 linuxMusicplayer.service 服务添加配置文件,该命令会自动在 /etc/systemd/system/ 中添加 linuxMusicplayer.service.d 文件夹,我们将 root 的环境变量加到该文件夹下的文件中。

root$: env     #使用env命令获得root的环境变量

添加到 /etc/systemd/system/linuxMusicplayer.service.d/ 下的文件中

[Service]
Environment="QT_QPA_EGLFS_INTEGRATION=eglfs_kms_egldevice"
Environment="LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:"
Environment="LC_MEASUREMENT=C.UTF-8"
Environment="SSH_ConNECTION=192.168.0.114 40456 192.168.0.108 22"
Environment="LESSCLOSE=/usr/bin/lesspipe %s %s"
Environment="LC_PAPER=C.UTF-8"
Environment="LC_MonETARY=C.UTF-8"
Environment="LANG=en_US.UTF-8"
Environment="QT_QPA_EGLFS_KMS_CONNECTOR_INDEX=0"
Environment="QTDIR=/usr/local/qt5jnano"
Environment="QT_QPA_FonTDIR=/usr/local/qt5jnano/lib/fonts"
Environment="QT_QPA_EGLFS_WIDTH=1920"
Environment="LC_NAME=C.UTF-8"
Environment="XDG_SESSION_ID=4"
Environment="USER=root"
Environment="QT_QPA_EGLFS_LAYER_INDEX=2"
Environment="QT_QPA_PLATFORM_PLUGIN_PATH=/usr/local/qt5jnano/plugins/"
Environment="QT_DEBUG_PLUGINS=1"
Environment="PWD=/home/test"
Environment="HOME=/root"
Environment="QT_QPA_EGLFS_HEIGHT=1080"
Environment="QT_QPA_EGLFS_KMS_PLANE_INDEX=1"
Environment="SSH_CLIENT=192.168.0.114 40456 22"
Environment="XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop"
Environment="LC_ADDRESS=C.UTF-8"
Environment="QML2_import_PATH=/usr/local/qt5jnano/qml"
Environment="LC_NUMERIC=C.UTF-8"
Environment="QT_QPA_EGLFS_PHYSICAL_WIDTH=527.04"
Environment="SSH_TTY=/dev/pts/0"
Environment="MAIL=/var/mail/root"
Environment="QT_QPA_EGLFS_KMS_ATOMIC=1"
Environment="SHELL=/bin/bash"
Environment="TERM=xterm-256color"
Environment="SHLVL=2"
Environment="LC_TELEPHONE=C.UTF-8"
Environment="QML_import_PATH=/usr/local/qt5jnano/qml"
Environment="QT_QPA_EGLFS_ALWAYS_SET_MODE=1"
Environment="QT_QPA_PLATFORM=eglfs"
Environment="LOGNAME=root"
Environment="DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus"
Environment="QT_LOGGING_RULES=qt.qpa.input=true"
Environment="XDG_RUNTIME_DIR=/run/user/1000"
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
Environment="LC_IDENTIFICATION=C.UTF-8"
Environment="QT_QPA_EGLFS_PHYSICAL_HEIGHT=296.46"
Environment="LESSOPEN=| /usr/bin/lesspipe %s"
Environment="LC_TIME=C.UTF-8"
Environment="_=/usr/bin/env"

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/642594.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号