资源
Toolchain Information
jetson-linux
jetpack
文章目录
- 资源
- 1 方案1 qemu-aarch64-static和docker 容器编译jetson
- 2 方案2 模拟器+交叉编译器
- 2.1 应对库缺失的情况,进行环境准备
- 2.1.1 模拟器(方案1)
- 2.1.2 在jetson上面进行安装(方案2)
- 2.2 获得根文件系统,解决CUDA依赖程序
- 2.2.1 打包根文件系统(方案1)
- 2.2.2 利用SDK Manager安装cuda(方案2)
- 2.3 交叉编译
- 2.3.1 下载交叉编译器
- Bootlin的GCC
- Linaro的GCC
- 区别总结
- 2.3.2 配置交叉编译 toolchain.cmake
- 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.2.1 打包根文件系统(方案1)
已经正常运行的jetson 系统上打包根文件系统
sudo su
cd /
tar -cvpzf backup.tgz --exclude=/proc --exclude=/lost+found --exclude=/backup.tgz --exclude=/mnt --exclude=/sys /
2.2.2 利用SDK Manager安装cuda(方案2)
利用SDK Manager安装根系统,得到根文件系统,得到cuda
2.3 交叉编译
2.3.1 下载交叉编译器
Bootlin和Linaro的GCC(GNU Compiler Collection,GNU编译器集合)在本质上都是基于GCC的交叉编译工具链,但它们在提供、维护、优化以及应用场景上存在一些区别。
Bootlin的GCC
- 提供与维护:Bootlin是一家专注于嵌入式Linux和开源软件的公司,它提供了一系列预编译的交叉编译工具链,包括GCC、GDB、Binutils等,这些工具链针对特定的目标架构进行了优化和测试。Bootlin的工具链通常可以在其官方网站上找到,并提供了多种版本和架构的支持。
- 应用场景:Bootlin的工具链广泛应用于嵌入式系统、物联网(IoT)设备、汽车电子等领域,帮助开发者在不同的硬件平台上构建和调试软件。
- 特点:Bootlin的工具链注重稳定性和兼容性,确保开发者能够在不同的开发环境中使用相同的工具链进行开发,减少因工具链差异导致的兼容性问题。
Linaro的GCC
- 提供与维护:Linaro是一个由多家半导体和硬件公司组成的非盈利性组织,旨在通过开源软件优化ARM架构的处理器性能。Linaro提供了基于GCC的交叉编译工具链,这些工具链针对ARM架构进行了深度优化,以提高编译效率和生成代码的性能。
- 应用场景:Linaro的工具链特别适用于基于ARM架构的嵌入式系统和移动设备,如智能手机、平板电脑、可穿戴设备等。它帮助开发者在ARM平台上快速构建和部署高性能的应用程序。
- 特点:Linaro的工具链注重性能优化和社区支持,通过持续的技术更新和社区贡献,确保开发者能够使用到最新的编译技术和最佳实践。
区别总结
Bootlin的GCC | Linaro的GCC | |
---|---|---|
提供与维护 | Bootlin公司提供,注重稳定性和兼容性 | Linaro组织提供,注重性能优化和社区支持 |
应用场景 | 广泛应用于嵌入式系统、IoT设备、汽车电子等领域 | 特别适用于基于ARM架构的嵌入式系统和移动设备 |
特点 | 稳定性和兼容性高,减少因工具链差异导致的兼容性问题 | 性能优化显著,通过持续更新和社区贡献保持技术领先 |
综上所述,Bootlin和Linaro的GCC在提供、维护、优化以及应用场景上各有侧重,开发者可以根据自己的具体需求和目标架构选择合适的工具链。
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 ../
(正文完)
今天先写笔记,明天试试方案有没有坑,有坑再填坑。