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
路径下
下载具体型号的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进行修改
修改为
即可验证caffe编译
4.6交叉编译opencv
进入目录
执行
编译:
Make –j16
拷贝
修改环境变量
验证
import cv2
即可验证open-cv编译