nvidia jetson 系列开发板交叉编译方法,CUDA依赖程序

资源

Toolchain Information
jetson-linux
jetpack

文章目录

  • 资源
  • [1 方案1 qemu-aarch64-static和docker 容器编译jetson](#1 方案1 qemu-aarch64-static和docker 容器编译jetson)
  • [2 方案2 模拟器+交叉编译器](#2 方案2 模拟器+交叉编译器)
    • [2.1 应对库缺失的情况,进行环境准备](#2.1 应对库缺失的情况,进行环境准备)
    • [2.1.1 模拟器(方案1)](#2.1.1 模拟器(方案1))
    • [2.1.2 在jetson上面进行安装(方案2)](#2.1.2 在jetson上面进行安装(方案2))
    • [2.2 打包根文件系统,解决CUDA依赖程序](#2.2 打包根文件系统,解决CUDA依赖程序)
    • [2.3 交叉编译](#2.3 交叉编译)
      • [2.3.1 下载交叉编译器](#2.3.1 下载交叉编译器)
      • [2.3.2 配置交叉编译 toolchain.cmake](#2.3.2 配置交叉编译 toolchain.cmake)
      • [2.3.3 执行编译](#2.3.3 执行编译)

1 方案1 qemu-aarch64-static和docker 容器编译jetson

打包已经正常运行的xavier系统的根文件系统,制作docker镜像,可以免去一些软件的安装,直接就可以进行应用程序的编译。

复制代码
sudo apt install qemu-user-static

已经正常运行的jetson 系统上打包根文件系统

复制代码
sudo su
cd /
tar -cvpzf backup.tgz --exclude=/proc --exclude=/lost+found --exclude=/backup.tgz --exclude=/mnt --exclude=/sys /

将打包好的文件系统拷贝到host系统上

复制代码
sudo scp backup.tgz host_user@host_ip_address:~ 

导入docker镜像

复制代码
docker import backup.tgz nvidia/xavier:r32.7.1
#查看已经导入的镜像
sudo docker images

运行docker镜像

复制代码
sudo docker run -it -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static -v /源码存储路径:/挂载容器内目录 nvidia/xavier:r32.7.1 /bin/bash   

在容器内对源码进行交叉编译,生成二进制文件通过scp方式拷贝到xavier上

复制代码
sudo scp backup.tgz xavier_user@xavier_ip_address:~ 

nvidia jetson 系列开发板系统烧录方法

1.固件下载地址

复制代码
https://developer.nvidia.com/embedded/jetson-linux-archive

2.寻找对应版本JETSON LINUX VERSION

复制代码
# 点击 See the online Jetson Linux Developer Guide for detailed documentation.
# 找到Quick Start 按照教程使用usb或C口线进行连接并进行烧录

2 方案2 模拟器+交叉编译器

2.1 应对库缺失的情况,进行环境准备

2.1.1 模拟器(方案1)

此处配置aarch64 ubuntu运行环境,并不是直接在该环境下进行编译工作,因为该环境下的编译太慢了;配置该环境,主要是为了能够更快速,更加便捷的获取交叉编译依赖的动态库,和静态库,头文件信息等。

参考:https://blog.csdn.net/leacock1991/article/details/113744066

参考:https://www.cnblogs.com/grass-and-moon/p/16173739.html

在编译过程中会出现很多链接库缺失的问题。这个时候就需要进入aarch64 ubuntu环境安装对应的库,并将安装后的头文件,库文件拷贝到/usr/aarch64-linux-gnu/lib目录下(或/usr/aarch64-linux-gnu/usr/lib,用于将后面拷贝的和原始带的库进行区分),头文件放到/usr/aarch64-linux-gnu/include/中。当然我们的头文件查找方式设置的是set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH),如果在host系统目录下能够找到,那么可以不用进行拷贝。

2.1.2 在jetson上面进行安装(方案2)

在aarch64 ubuntu环境下安装的库存在异常的可能,那么可以在jetson上面进行安装,然后将对应库拷贝出来即可。

2.2 打包根文件系统,解决CUDA依赖程序

2.3 交叉编译

2.3.1 下载交叉编译器


2.3.2 配置交叉编译 toolchain.cmake

改文件参考了:https://docs.nvidia.com/vpi/sample_cross_aarch64.html

复制代码
# ref: https://docs.nvidia.com/vpi/sample_cross_aarch64.html
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)

set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnc-g++)

set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)

set(CMAKE_CUDA_FLAGS "-ccbin ${CMAKE_CXX_COMPILER} -Xcompiler -fPIC" CACHE STRING "" FORCE)

这里有个需要关注的点是配置了,CMAKE_CUDA_FLAGS,其中对ccbin参数设置为${CMAKE_CXX_COMPILER},这个目的是设置nvcc执行过程中回调用的编译器,如果没有这个,那么生成得到.o文件将是host 机器(x86)平台下面的。

参考中的set(CMAKE_TRY_COMPILER_TARGET_TYPE STATIC_LIBRARY)这句话可以不需要,加上的话cmake的时候cuda检测会通不过。

2.3.3 执行编译

复制代码
cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ../

(正文完)

今天先写笔记,明天试试方案有没有坑,有坑再填坑。

相关推荐
花花少年13 天前
Ubuntu系统下交叉编译gpac
交叉编译·gpac
nnnnichijou16 天前
Qt 6.9 嵌入式 Linux 交叉编译全栈填坑指南(以树莓派5 AArch64 为例
qt·嵌入式·交叉编译·qml·树莓派5
jrrz08281 个月前
Apollo OSQP库交叉编译
vscode·apollo·交叉编译·mpc·osqp
六点的晨曦2 个月前
OpenCV 4.3 交叉编译 AArch64 完整指南(x64 Ubuntu 20.04)
opencv·交叉编译·ubuntu20.04·aarch64
seaside20033 个月前
ggml交叉编译安卓部署大模型
安卓·交叉编译·ggml
特立独行的猫a5 个月前
鸿蒙PC生态三方命令行软件移植:XZ压缩工具移植到鸿蒙PC平台的完整指南
华为·harmonyos·移植·命令行·交叉编译·xz命令
威桑5 个月前
交叉编译过程中的踩坑与收获
linux·c++·arm·交叉编译
特立独行的猫a5 个月前
鸿蒙PC三方库编译libiconv链接报错,解决 libtool 链接参数丢失问题过程总结
harmonyos·交叉编译·libiconv·三方库·鸿蒙pc·libtool
特立独行的猫a5 个月前
鸿蒙PC命令行及三方库libiconv移植:鸿蒙PC生态的字符编码基石
harmonyos·交叉编译·libiconv·三方库移植·鸿蒙pc