JETSON交叉编译

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



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

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


通过链接下载对应版本工具链:
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.交叉编译环境设置方法



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



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

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



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

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

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

检查状态是否满足。



然后在host设置NFS。


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拷贝出来


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

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

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

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

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

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

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

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


复制config文件后vim,效果为


执行make menuconfig



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


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


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


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


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

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



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

./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

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


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


执行:

./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


4.3.2编译语义分割
cd进路径


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


修改后,在主机进行编译



在jetson路径下



执行命令
./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 路径下


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

编译完成后将其拷贝到jetson

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


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

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

建立build文件夹

Cmake

编译

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

在jetson上修改caffe环境变量

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

修改为

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

执行


编译:
Make –j16
拷贝


修改环境变量


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章