赞
踩
最近公司给了我一块Jetson Orin Nano的板子,先刷了系统(1.Jetson Orin Nano Developer Kit系统刷机)又让我搭建交叉编译环境,所以有了下面的文章
- Ubuntu20.04:
- Qt 源码 5.14.2
- Qt 软件 5.14.2
- gcc 版本 9.4.0
- g++ 版本 9.4.0
Ubuntu 20.04
Qt源码下载(最好下载tar.xz,tar格式可能在windows下编辑过,后期可能会出现乱码的情况)
Index of /archive/qt/5.14/5.14.2/single
https://download.qt.io/archive/qt/5.14/5.14.2/
Ubuntu 20.04系统默认安装g++和gcc版本是9.4.0,如果Ubuntu系统上没有g++和gcc安装命令:
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
安装好之后查看版本(如下图)
- aarch64-linux-gnu-gcc -v
-
- aarch64-linux-gnu-g++ -v
Jetson 系统 自行安装
注意
- `SDK Manager`下使用的包是`JetPack5.1.1(rev.1);`
- 使用命令行安装使用的`BSP`包是`Jetson_Linux_R35.3.1_aarch64.tbz2`
`Sample Root Filesystem`是`Tegra_Linux_Sample-Root-Filesystem_R35.3.1_aarch64.tbz2`
sudo passwd root#设置Jetson Orin Nano root的账号密码
开启ssh
保证其它用户能够通过ssh root@ip
访问,开启ssh
为了文件拷贝等操作。
- sudo apt-get update #只是更新了apt的资源列表,没有真正的对系统执行更新。apt-get update是同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。
- sudo apt-get upgrade #对比本地软件版本与源上软件版本,并更新本地版本到源上最新版本。
- sudo apt-get install '.*libxcb.*' libxrender-dev libxi-dev libfontconfig1-dev libudev-dev
- sudo apt-get install libgles2-mesa-dev libgl1-mesa-dev
进入Jetson Orin Nano
的/usr/lib/aarch64-linux-gnu/tegra-egl
目录,执行:
- sudo ln -s libGLESv2_nvidia.so.2 libGLESv2.so
- sudo ln -s libEGL_nvidia.so.0 libEGL.so
实际上只是将这两个英伟达提供的 gl 动态库重命名,不同的设备厂商提供的支持库名字可能会有差异;
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
安装好后使用
which aarch64-linux-gnu-gc c#命令查看其安装位置
我的位置在`/usr/bin/aarch64-linux-gnu-gcc `下
安装后面所需要的其它工具
- sudo apt-get install git bison python gperf pkg-config
- sudo apt-get install make libclang-dev build-essential
编译/etc/profile
文件,
sudo vim /etc/profile
在编译模式下先按`i`进行文本插入,在文件底部加入` export PATH="/usr/bin:$PATH"`
然后按`ESC` 并输入`wq`保存。最后进行`source /etc/profile `更新环境变量,查看`/usr/bin`是否已经加入到环境变量,使用`echo ${PATH}`, 结果如下:
- mkdir /opt/Qt5JetsonOrinNano
- cd /opt/Qt5JetsonOrinNano
- sudo chown username:username /opt/Qt5JetsonOrinNano#(username 是/home/ 下你的用户名) 修改Qt5JetsonOrinNano组
- sudo tar xf qt-everywhere-src-5.14.2.tar.xz
在/opt/Qt5JetsonOrinNano
目录下使用mkdir sysroot
创建sysroot
文件夹,然后同步Jetson Orin Nano
上面的库到Server
上
- rsync -avz root@JetsonOrinNanoIp:/lib sysroot
- rsync -avz root@ JetsonOrinNanoIp:/usr/include sysroot/usr
- rsync -avz root@ JetsonOrinNanoIp:/usr/lib sysroot/usr
sysroot
软链接在同步库后,然后需要修改sysroot
里面的软链接,里面有很多软连接使用的都是绝对路径,那就会直接链接到你PC的/usr、/lib目录里面去,那肯定是错的,我们希望它们链接到 sysroot
里面对应的库。所以我们需要把绝对路径改成相对路径。直接用网上现成的python脚本完成(有时会连接超时,自己想办法下载)。
sudo wget https://github.com/Kukkimonsuta/rpi-buildqt/blob/master/scripts/utils/sysroot-relativelinks.py
脚本内容如下:
- #!/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] + "<directory>")
- 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)
然后给sysroot-relativelinks.py
添加权限
sudo chmod +x sysroot-relativelinks.py
运行文件
- ./sysroot-relativelinks.py sysroot #修改sysroot下相关Lib的软链接
- rsync -avz root@JetsonOrinNanoIp:/lib sysroot #我这是不放心又同步一次
- rsync -avz root@ JetsonOrinNanoIp:/usr/include sysroot/usr
- ./sysroot-relativelinks.py sysroot
Jetson Orin Nano
的qmake.conf
文件先查看devices下支持的设备
ls qt-everywhere-src-5.14.2/qtbase/mkspecs/devices/
查看qt源码下支持的设备,由于没有 Nano 文件夹,我们使用相似的linux-jetson-tx1-g++`复制一份`jetson orin nano`的文件夹,
cp -r qt-everywhere-src-5.14.2/qtbase/mkspecs/devices/linux-jetson-tx1-g++/ qt-everywhere-src-5.14.2/qtbase/mkspecs/devices/linux-jetson-orin-nano/
修改`qt-everywhere-src-5.14.2/qtbase/mkspecs/devices/linux-jetson-orin-nano/qmake.conf`文件,内容如下:
- #
- # qmake configuration for the Jetson Orin Nano boards running Linux For Tegra
- #
- # Note that this environment has been tested with X11 only.
- #
- # A typical configure line might look like:
- # configure \
- # -device linux-jetson-orin-nano \
- # -device-option CROSS_COMPILE=/usr/bin/aarch64-linux-gnu- \
- # -sysroot /opt/Qt5JetsonOrinNano/sysroot
-
- 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]/lib/aarch64-linux-gnu
-
- QMAKE_INCDIR_EGL = $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu/tegra-egl
- DISTRO_OPTS += aarch64
- COMPILER_FLAGS += -march=armv8-a+crc+crypto
- EGLFS_DEVICE_INTEGRATION = eglfs_kms_egldevice
- include(../common/linux_arm_device_post.conf)
- load(qt_config)
- mkdir Qt5Build
- cd Qt5Build
配置make 的编译环境
sudo ../qt-everywhere-src-5.14.2/configure -opengl es2 -xcb -device linux-jetson-orin-nano -device-option CROSS_COMPILE=/usr/bin/aarch64-linux-gnu- -sysroot /opt/Qt5JetsonOrinNano/sysroot -prefix /usr/local/Qt5JetsonOrinNano -opensource -confirm-license -skip qtmultimedia -skip qtscript -skip qtwebengine -force-debug-info -skip qtdatavis3d -skip qtlocation -nomake examples -make libs -pkg-config -no-eglfs -no-use-gold-linker -v
ERROR: Feature 'xcb' was enabled, but the pre-condition 'features.thread &&..... #出现这个问题,把上面命令中的 -xcb-xlib配置项去掉。可以-xcb 不删除。
sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
如果还有问题,再查找其解决方案
编译:
sudo make -j4
等待编译完成之后再进行安装
sudo make install
安装后的目录如下:
查看编译生成目录下的qmake是否存在,用于配置qtcreator的qmake环境
把编译生成的相关库同步到Jetson Orin Nano上。
sudo rsync -avz sysroot/usr/local/Qt5JetsonOrinNano root@ JetsonOrinNanoIp:/usr/local
至此QT源码编译完成。
- mkdir testCrossCompiler &&cd testCrossCompiler
- touch hello.cpp
- vim hello.cpp
- #include <QCoreApplication>
- #include <QDebug>
-
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
-
- qDebug() << "Hello World";
-
- return a.exec();
- }
/opt/Qt5JetsonOrinNano/sysroot/usr/local/Qt5JetsonOrinNano/bin/qmake -project
scp ./testCrossCompiler nvidia@JetsonOrinNanoIp:/home/nvidia/Downloads/test
Jetson Orin Nano
上运行编译生成的文件./testCrossCompiler
下面会出Server上配置ARM的交叉编译环境。
好久没有写文章了。上面的应该勉强能看。如有问题请提出,我不会修改的(哈哈)。如果按照步骤弄不成,多找找自身的原因(手动滑稽)。
最后最后,有问题请在评论区提出,我会帮助解决。感谢查看
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。