JETSON交叉编译

1.交叉编译简要流程及必要性


image.png

程序在X85和ARM机器指令集不同,需要交叉编译才能在不同机器上运行。
交叉编译优点

2.交叉编译前通信工具链设置
内核交叉编译需要通信,jetson提供了通信工具链


image.png

通过链接下载对应版本工具链:
http://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/gcc-linaro-7.3.1-2018.05x86_64_aarch64-linux-gnu.tar.xz
解压工具链:

$ mkdir $HOME/l4t-gcc 
$ cd $HOME/l4t-gcc
$ tar xf gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz

3.交叉编译环境设置方法


image.png

交叉编译环境设置方法包括三种,1.直接配置环境变量2.配置Makefile文件3.建立仿真环境.其中1与2方法类似。
3.1直接配置环境变量


image.png

首先指定交叉编译路径,然后指定gcc,g++等二进制文件对应在交叉编译的路径。
遇到一些奇怪问题,通过export LC_ALL=C命令尝试解决。

该方法优点:编译中所有需要的环境变量可以直观的进行手动指定。指定后交叉编译所有需要的环境变量和库等可满足要求。
该方法缺点:所有库环境变量手动指定,其他项目的环境变量需要二次配置。适用于简单项目,较为复杂的项目不适合使用此方法配置环境。
3.2 在makefile中进行编译
3.2.1 makefile文件修改
参考此模板生成新的makefile文件。


image.png

3.2.2 NFS挂载jetson与X86机器
首先在jetson上设置。
image.png

在jetson机器上先安装nfs-kernel-server,使用vim进行信息配置,
查看信息是否满足。这样可以实现通过NFS将jetson暴露给host.
image.png

之后分别执行
$ sudo exportfs –a
$ sudo systemctl restart nfs-kernel-server.service
$ sudo exportfs

检查状态是否满足。


image.png

然后在host设置NFS。


image.png
sudo /etc/fstab
192.168.55.1:/ /mnt/rootfs nfs defaults 0 0

的作用为设置开机自动挂载,如不需要,使用手动挂载即可。

$ sudo mount –t nfs 192.168.55.1:/ /mnt/rootfs

3.3 建立仿真环境

使用Chroot&Qeum配置一个仿真环境,设置交叉编译环境

该方法适用于解决复杂问题。

首先安装chroot


sudo apt install chroot

接下来安装qemu

直接使用apt install qemu 会有问题,需要使用github提供的编译版本qemu-aarch64-static.

https://github.com/zhj-buffer/Cross-Compile-Jetson

将jetson 的rootfs拷贝出来

image.png

例如此路径下。
将qemu-aarch64文件拷到当前文件下。
image.png

在模拟环境启动前,先进性mount
image.png

详细参考示例见https://github.com/zhj-buffer/Cross-Compile-Jetson
4、交叉编译案例
image.png

2.1内核(kernel)交叉编译
cd /nvidia/nvidia_sdk/sources/kernel/kernel-4.9
路径下
./source_sync.sh -t tegra-l4t-r32.3.1
下载具体型号的kernel
image.png

vim Makefile可查看相关信息,交叉编译需要指定在Makefile指定CROSS_COMPILE
image.png

前文toolchain默认下载后解压路径为
image.png

在bashrc中设置CROSS_COMPILE环境路径路径,给定ARCH, CROSS_COMPILE,LOCALVERSION.
设定后Makefile文件中的CROSS_COMPILE路径就与此定义路径相同,其他g++等路径可在此基础上自动找到。
vim ~/.bashrc
image.png

编译内核config文件。直接从jetson 的proc路径下拷贝config.gz文件

image.png

复制config文件后vim,效果为


image.png

执行make menuconfig


image.png

执行save操作后exit.
交叉编译环境配置已经完成,开始编译即可。make Image


image.png

make –j16
以上操作在主机上完成,将编译好的kernel拷贝到jetson上进行更新


image.png

4.2Multi Media api交叉编译流程
cd进入tegra_multimedia_api/samples,相关文件均可通过交叉编译实现。


image.png

指定target_rootfs路径
进入路径,vim Rules.mk


image.png

参考下图对相关项进行修改指定:

image.png

修改后,可进行交叉编译。
进入路径后,执行make命令。


image.png

该路径下执行交叉编译命令:

./video_dec_trt2 ../../data/Video/sample_outdoor_car_1080p_10fps.h264  ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264    --trt-deployfile../../data/Model/resnet10/resnet10.prototxt      --trt-modelfile../../data/Model/resnet10/resnet10.caffemodel      --trt-mode 0
image.png

编译中如报错找不到路径的错误,需要指定其对应的路径,通过软连接方式进行指定。


image.png

同理backend的编译操作类似。
进入路径:


image.png

执行:

./backend 1 ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 --trt-deployfile
../../data/Model/GoogleNet_one_class/GoogleNet_modified_oneClass_halfHD.prototxt --trt-modelfile
../../data/Model/GoogleNet_one_class/GoogleNet_modified_oneClass_halfHD.caffemodel --trt-mode 0 --trt-procinterval
1 -fps 10

4.3 Deep stream交叉编译流程
4.3.1编译ssd


image.png

4.3.2编译语义分割
cd进路径


image.png

参考下图,
修改Makefile (vim Makefile)


image.png

修改后,在主机进行编译


image.png

在jetson路径下


image.png

执行命令
./deepstream-segmentation-app
dstest_segmentation_config_semantic.txt
sample_720p.mjpeg sample_720p.mjpeg

4.4交叉编译CUDA
仿真环境搭建好以后,编译cuda sample
主机进入目录 cd /usr/local/cuda/bin
里面的cuda-install-samples-10.2.sh是想编译的sample
将其拷贝到jetson 路径下

image.png

仿真环境是在主机上同时有主机和jetson的路径,在主机上即可完成对于jetson的交叉编译,与在jetson上编译效果相同。
直接在主机路径上进行编译
image.png

编译完成后将其拷贝到jetson
image.png

用传统方法做也可以,这个例子需要设置环境变量较少。
编译完成后在路径下运行编译好的sample,可查看效果
image.png

image.png

4.5交叉编译Caffe
在仿真环境编译caffe
编译caffe之前,需要先安装cmake.由于ubuntu默认cmake版本比较旧,编译caffe,opencv会有问题。采用源码编译cmake。步骤如下图
image.png

接下来安装caffe需要的其他依赖
image.png

建立build文件夹
image.png

Cmake
image.png

编译
image.png

编译完成后,make all
编译完成的路径在:
cd /media/green/M0/rootfs-xavier/home/nvidia/caffe/build
拷贝到jetson
image.png

在jetson上修改caffe环境变量
image.png

将~/.bashrc中的pythonpath进行修改
image.png

修改为
image.png

import caffe
即可验证caffe编译
4.6交叉编译opencv
进入目录
image.png

执行


image.png

编译:
Make –j16
拷贝


image.png

修改环境变量


image.png

验证
import cv2
即可验证open-cv编译

你可能感兴趣的:(JETSON交叉编译)