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)