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)
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
Jetson TX2是一种强大的嵌入式计算平台,在进行交叉编译时可以简化软件开发的过程。交叉编译是指在一台主机上编写并构建适用于其他不同硬件平台的软件。 要在Jetson TX2上进行交叉编译,首先需要在主机上安装相应的交叉编译工具链。这个工具链包含了用于生成针对Jetson TX2的二进制可执行文件所需的编译器、链接器和其他必要的工具。通常可以从官方网站或开发者社区获得Jetson TX2专用的交叉编译工具链。 安装好交叉编译工具链后,就可以开始编写和构建软件了。首先,在主机上编写源代码或修改现有的代码。接下来,使用交叉编译工具链中的编译器将源代码编译成适用于Jetson TX2的目标二进制文件。可以通过指定适当的目标平台和编译选项来确保生成的二进制文件可以在Jetson TX2上运行。 在编译过程中,可能需要包含Jetson TX2特定的库和头文件。这些库和头文件可以通过Jetson TX2专用的软件开发工具包(SDK)或其他渠道进行获取。确保将这些依赖项正确地配置到编译过程中,以确保生成的二进制文件能够与Jetson TX2上的其他组件正确地交互。 完成编译后,可以将生成的二进制文件将其复制到Jetson TX2上进行测试和部署。在Jetson TX2上设置正确的运行环境,以确保可以正常运行交叉编译的软件。 总之,交叉编译是一种方便而高效的方法,可以在主机上轻松开发和测试适用于嵌入式平台如Jetson TX2的软件。通过使用适当的工具链和依赖项,可以确保生成的二进制文件能够在Jetson TX2上稳定运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值