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
拷貝
修改環境變量
驗證
import cv2
即可驗證open-cv編譯