Linux Server 20.04 Qt5.14.2配置Jetson Orin Nano Developer Kit 交叉编译环境

news2024/11/24 0:32:57

最近公司给了我一块Jetson Orin Nano的板子,让我搭建交叉编译环境,所以有了下面的文章

一 :Qt5.14.2交叉编译环境安装

1.准备

1.1设备环境

1.1.1 Server:

Ubuntu20.04:
Qt 源码 5.14.2
Qt 软件 5.14.2
gcc 版本  9.4.0
g++ 版本 9.4.0

1.1.2 Jetson Orin Nano :

Ubuntu 20.04

1.2 Qt相关下载地址

1.2.1 Qt源码下载

Qt源码下载(最好下载tar.xz,tar格式可能在windows下编辑过,后期可能会出现乱码的情况)

Index of /archive/qt/5.14/5.14.2/single

1.2.2 Qt软件下载地址

https://download.qt.io/archive/qt/5.14/5.14.2/    

1.3 gcc和g++安装

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

1.4 Jetson Orin Nano Developer Kit 系统安装方法

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`

 2.Jetson Orin Nano Developer Kit 环境准备

2.1 设置root账号密码

sudo passwd root#设置Jetson Orin Nano root的账号密码

2.2 设置ssh

开启ssh保证其它用户能够通过ssh root@ip 访问,开启ssh为了文件拷贝等操作。

2.3 更新资源列表

sudo apt-get update #只是更新了apt的资源列表,没有真正的对系统执行更新。apt-get update是同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。
sudo apt-get upgrade #对比本地软件版本与源上软件版本,并更新本地版本到源上最新版本。

2.4 安装Qt依赖库

2.4.1 安装Qt依赖库

sudo apt-get install '.*libxcb.*'  libxrender-dev libxi-dev libfontconfig1-dev libudev-dev
sudo apt-get install libgles2-mesa-dev libgl1-mesa-dev

2.4.2 软连接opengl es库

进入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 动态库重命名,不同的设备厂商提供的支持库名字可能会有差异;

3.Server编译Qt源码

3.1 在server上安装交叉编译器并配置环境变量

3.1.1 安装命令:

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 

3.2 配置环境变量

编译/etc/profile文件,

sudo vim /etc/profile

在编译模式下先按`i`进行文本插入,在文件底部加入` export PATH="/usr/bin:$PATH"`
然后按`ESC` 并输入`wq`保存。最后进行`source /etc/profile `更新环境变量,查看`/usr/bin`是否已经加入到环境变量,使用`echo ${PATH}`, 结果如下:

3.3 编译源码

3.3.1解压Qt源码

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

3.3.2 同步Jeston Orin Nano上的库到本地

/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

3.3.3 修改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

3.3.4创建Jetson Orin Nanoqmake.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)

3.3.5建立编译文件夹

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

出现错误([(1条消息) Ubuntu18源码编译安装qt5.15.3和MeshLab踩坑_error: feature 'xcb' was enabled, but the pre-cond_JaceYangg的博客-CSDN博客]

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源码编译完成。

4.Server交叉编译代码到Jetson Orin Nano上

4.1 在Server上创建一个`test`文件夹

 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();
}

4.2使用编译Qt源码生成的qmake编译项目 生成.pro文件

4.2.1 在testCrossCompiler目录下使用`qmake`命令

/opt/Qt5JetsonOrinNano/sysroot/usr/local/Qt5JetsonOrinNano/bin/qmake -project

4.2.2 使用`qmake`生成`Makefile`文件

 

 4.2.3 使用命令`make`生成`arm`文件

4.2.4 拷贝文件到`Jetson Orin Nano`上运行

scp ./testCrossCompiler  nvidia@JetsonOrinNanoIp:/home/nvidia/Downloads/test

4.2.5 在Jetson Orin Nano上运行编译生成的文件

./testCrossCompiler


下面会出Server上配置ARM的交叉编译环境。

好久没有写文章了。上面的应该勉强能看。如有问题请提出,我不会修改的(哈哈)。如果按照步骤弄不成,多找找自身的原因(手动滑稽)。

最后最后,有问题请在评论区提出,我会帮助解决。感谢查看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/892148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 React 中获取数据的6种方法

一、前言 数据获取是任何 react 应用程序的核心方面。对于 React 开发人员来说&#xff0c;了解不同的数据获取方法以及哪些用例最适合他们很重要。 但首先&#xff0c;让我们了解 JavaScript Promises。 简而言之&#xff0c;promise 是一个 JavaScript 对象&#xff0c;它将…

openGauss学习笔记-42 openGauss 高级数据管理-触发器

文章目录 openGauss学习笔记-42 openGauss 高级数据管理-触发器42.1 语法格式42.2 参数说明42.3 示例 openGauss学习笔记-42 openGauss 高级数据管理-触发器 触发器会在指定的数据库事件发生时自动执行函数。 42.1 语法格式 创建触发器 CREATE TRIGGER trigger_name { BEFORE…

Java8实战-总结16

Java8实战-总结16 引入流流与集合只能遍历一次外部迭代与内部迭代 引入流 流与集合 只能遍历一次 和迭代器类似&#xff0c;流只能遍历一次。遍历完之后&#xff0c;这个流就已经被消费掉了。可以从原始数据源那里再获得一个新的流来重新遍历一遍&#xff0c;就像迭代器一样…

使用qsqlmysql操作mysql提示Driver not loaded

环境: win10 IDE: qt creator 编译器: mingw32 这里简单的记录下。我遇到的情况是在IDE使用debug和release程序都是运行正常&#xff0c;但是当我编译成发布版本之后。老是提示Driver not load。 这就很奇诡了。 回顾了下编译的时候是需要在使用qt先编译下libqsqlmysql.dll的…

从入门到精通Python隧道代理的使用与优化

哈喽&#xff0c;Python爬虫小伙伴们&#xff01;今天我们来聊聊如何从入门到精通地使用和优化Python隧道代理&#xff0c;让我们的爬虫程序更加稳定、高效&#xff01;今天我们将对使用和优化进行一个简单的梳理&#xff0c;并且会提供相应的代码示例。 1. 什么是隧道代理&…

V2board缓存投毒漏洞复现

1.什么是缓存投毒 缓存投毒&#xff08;Cache poisoning&#xff09;&#xff0c;通常也称为域名系统投毒&#xff08;domain name system poisoning&#xff09;&#xff0c;或DNS缓存投毒&#xff08;DNS cache poisoning&#xff09;。它是利用虚假Internet地址替换掉域名系…

数据结构—排序

8.排序 8.1排序的概念 什么是排序&#xff1f; 排序&#xff1a;将一组杂乱无章的数据按一定规律顺序排列起来。即&#xff0c;将无序序列排成一个有序序列&#xff08;由小到大或由大到小&#xff09;的运算。 如果参加排序的数据结点包含多个数据域&#xff0c;那么排序往…

Arduino 入门学习笔记10 使用I2C的OLED屏幕

Arduino 入门学习笔记10 使用I2C的OLED屏幕 一、准备工具二、JMD0.96C-1介绍1. 显示屏参数2. SSD1306驱动芯片介绍&#xff1a; 三、使用Arduino开发步骤1. 安装库&#xff08;1&#xff09;Adafruit_GFX_Library 库&#xff08;2&#xff09;Adafruit_SSD1306 驱动库&#xff…

HCIP——STP配置案例

STP配置案例 一、简介二、实现说明1、华为实现说明2、其他厂商实现 三、STP原理1、协商原则2、角色和状态3、报文格式4、BPDU报文处理流程4.1 BPDU报文的分类4.2 BPDU报文的处理流程4.3 BPDU报文格式 四、使用注意事项五、配置举例1、组网需求2、配置思路3、操作步骤4、配置文件…

多维时序 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经网络的数据多变量时间序列预测

多维时序 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经网络的数据多变量时间序列预测 目录 多维时序 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经网络的数据多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 多维时序 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经…

大模型技术实践(一)|ChatGLM2-6B基于UCloud UK8S的创新应用

近半年来&#xff0c;通过对多款主流大语言模型进行了调研&#xff0c;我们针对其训练方法和模型特点进行逐一分析&#xff0c;方便大家更加深入了解和使用大模型。本文将重点分享ChatGLM2-6B基于UCloud云平台的UK8S实践应用。 01各模型结构及特点 自从2017年6月谷歌推出Transf…

【OpenCV学习笔记】我的OpenCV学习之路

刚开始接触OpenCV是因为需要进行图像的处理&#xff0c;由于之前没有接触过&#xff0c;所以只能自己进行学习&#xff0c;下面将学习的过程做简单记录分享。 OpenCV专栏链接 OpenCV学习笔记 一、引言 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是…

【C# 基础精讲】文件读取和写入

文件读取和写入是计算机程序中常见的操作&#xff0c;用于从文件中读取数据或将数据写入文件。在C#中&#xff0c;使用System.IO命名空间中的类来进行文件读写操作。本文将详细介绍如何在C#中进行文件读取和写入&#xff0c;包括读取文本文件、写入文本文件、读取二进制文件和写…

MyBatis动态SQL:打造灵活可变的数据库操作

目录 if标签trim标签where标签set标签foreach标签 动态SQL就是根据不同的条件或需求动态地生成查询语句&#xff0c;比如动态搜索条件、动态表或列名、动态排序等。 if标签 在我们填写一些信息时&#xff0c;有些信息是必填字段&#xff0c;有的则是非必填的&#xff0c;这些…

Docker版TDengine2.6升级到Tdengine3.0

此升级性质为导入导出操作 2.6版本操作步棸 进入docker容器 docker exec -it a5f88c26119d bash 查找taosdump文件路径 find -name /taosdump 进入taosdump外层文件夹中&#xff0c;执行导出命令 ./taosdump -o /root -D power -T 4 实际导出命令可根据个人需求查到官方文档…

Spring Boot中使用validator如何实现接口入参自动检验

文章目录 一、背景二、使用三、举例 一、背景 在项目开发过程中&#xff0c;经常会对一些字段进行校验&#xff0c;比如字段的非空校验、字段的长度校验等&#xff0c;如果在每个需要的地方写一堆if else 会让你的代码变的冗余笨重且相对不好维护&#xff0c;如何更加规范和优…

【经典排序】—— “希尔排序”

插入排序希尔排序插入排序VS希尔排序 测试 希尔排序是在插入排序的基础上进行改进优化&#xff0c;所以学习希尔排序之前需要先了解插入排序。 插入排序 像玩扑克牌摸牌时一样&#xff0c;一张一张摸&#xff0c;每摸到一张插入到对应的位置&#xff0c;插入排序就是从第一个位…

最强自动化测试框架Playwright(33)-Route类拦截修改请求

在Playwright中&#xff0c;Route类用于捕获和修改请求和响应。它允许您拦截和处理特定的网络请求&#xff0c;以模拟不同的行为或进行自定义操作。 您可以使用page.route()方法创建Route对象&#xff0c;并指定要拦截的请求URL或使用正则表达式进行匹配。 一旦创建了Route对…

hive--给表名和字段加注释

1.建表添加注释 CREATE EXTERNAL TABLE test(loc_province string comment 省份,loc_city string comment 城市,loc_district string comment 区,loc_street string comment 街道,)COMMENT 每日数据处理后的表 PARTITIONED BY (par_dt string) ROW FORMAT SERDEorg.apache.had…

SpringBoot ⽇志⽂件

日志 1. 作用2. 日志的使用3. 日志的级别4. 日志的持久化 1. 作用 日志最主要的⽤途就是排除和定位问题。 除了发现和定位问题之外&#xff0c;我们还可以通过⽇志实现以下功能&#xff1a; 记录⽤户登录⽇志&#xff0c;⽅便分析⽤户是正常登录还是恶意破解⽤户。记录系统的…