Jetson NX交叉编译踩坑记录

1. 交叉编译工具链,编译出错
使用官网上指定gcc-linaro编译工具,却出现如下错误:

aarch64-linux-gnu/libc/usr/include/stdio.h:47:1: error: '__BEGIN_NAMESPACE_STD' does not name a type; did you mean '__BEGIN_DECLS'?
 __BEGIN_NAMESPACE_STD
/data/jetson_depend/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.5.0/cwchar:64:11: error: '::mbstate_t' has not been declared
   using ::mbstate_t;
           ^~~~~~~~~
/data/jetson_depend/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.5.0/cwchar:141:11: error: '::btowc' has not been declared
   using ::btowc;
           ^~~~~
/data/jetson_depend/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.5.0/cwchar:142:11: error: '::fgetwc' has not been declared
   using ::fgetwc;
           ^~~~~~
/data/jetson_depend/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.5.0/cwchar:143:11: error: '::fgetws' has not been declared
   using ::fgetws;
           ^~~~~~
/data/jetson_depend/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.5.0/cwchar:144:11: error: '::fputwc' has not been declared
   using ::fputwc;
           ^~~~~~
/data/jetson_depend/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.5.0/cwchar:145:11: error: '::fputws' has not been declared
   using ::fputws;
           ^~~~~~
/data/jetson_depend/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.5.0/cwchar:146:11: error: '::fwide' has not been declared
   using ::fwide;
           ^~~~~
/data/jetson_depend/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.5.0/cwchar:147:11: error: '::fwprintf' has not been declared
   using ::fwprintf;
           ^~~~~~~~
/data/jetson_depend/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.5.0/cwchar:148:11: error: '::fwscanf' has not been declared
   using ::fwscanf;
           ^~~~~~~
/data/jetson_depend/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.5.0/cwchar:149:11: error: '::getwc' has not been declared
   using ::getwc;

*******

都是一些c++自己的符号没有找到,起初以为编译工具链的so路径找不到,export之后依然不行。
偶然发现,ubuntu apt-get有编译工具链,遂使用如下命令安装

apt-get install gcc-aarch64-linux-gnu
apt-get install g++-aarch64-linux-gnu

可正常编译。

2. find_path /find_library NOTFOUND
交叉编译toolchain.cmake设置如下

SET ( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
SET ( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )

由于忘记设置CMAKE_FIND_ROOT_PATH变量, 上述两个变量设置成ONLY后,find_* 只会在指定的目录中搜寻相关依赖so和include文件,所以一直显示NOTFOUND。如果设置为BOTH,可能会有HOST机器上和交叉编译链所需要的依赖相同,导致冲突。

3. cuda 交叉编译工具
本来以为cuda和其他的依赖一样,只需要提供相关的include文件和so就好了,但是cu文件在编译的时候需要调用nvcc。
NVIDIA SDKManager工具中提供了Host上cuda交叉编译工具,下载安装就好了。

4. 运行无报错但是core dump
交叉编译完成,在盒子上执行可执行文件,却出现core dump。ldd发现很多opencv的符号表找不到。是因为opencv库也是在host上交叉编译出来的,但是在盒子却不能使用。
进行交叉编译时,依赖包最好在target机器上编译完成,再在host机器上交叉编译使用。依赖包如果在Host上使用交叉编译的方式,如果存在一些其他未知的依赖库,可能会导致,虽然编译完成,但依然无法加载。


Jetson NX 交叉编译cmake

#jetson_tookchain.cmake

# set cross-compiled system type, it's better not use the type which cmake cannot recognized.
SET ( CMAKE_SYSTEM_NAME Linux )
SET ( CMAKE_SYSTEM_PROCESSOR aarch64 )

set(DEPEND_LIB_PATHS "" CACHE PATH "The path of the library on which cross compilation depends")

if (NOT "${DEPEND_LIB_PATHS}" STREQUAL "")
    SET(CMAKE_FIND_ROOT_PATH "${DEPEND_LIB_PATHS}")
endif()

# set searching rules for cross-compiler
SET ( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET ( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
SET ( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )

SET ( CMAKE_C_COMPILER "${GCC_CHAIN_PATH}aarch64-linux-gnu-gcc" )
SET ( CMAKE_CXX_COMPILER "${GCC_CHAIN_PATH}aarch64-linux-gnu-g++" )

# message("${GCC_CHAIN_PATH}aarch64-linux-gnu-gcc")

option(JETSON "use jetson nx" ON)
option(CUDA_cudart_static_LIBRARY "use cudart static library" OFF)
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值