交叉编译找不到某些库

时间:2020-07-28 05:17:28

标签: c++ linux gcc cmake cross-compiling

我正在尝试使用aarch64 PC为 Jetson nano x86_64)交叉编译ROS软件包。我正在使用toolchain provided by nvidia(用于64位BSP的GCC工具链)。我一直在关注this article以获得指导

由于编译器需要aarch64系统中的二进制文件,因此我已将nano的/usr/include装入了构建目录的usr/include中。这是我的构建目录层次结构。

.
├── gcc-4.8.5-aarch64   #<cross compiler>
│   └── install
│       ├── aarch64-unknown-linux-gnu
│        ...
├── opt                 #<ROS source files from nano>
│   └── ros
│       └── melodic
├── src                 #<test c++ code in here>
│   └── test_cpp
│       └── src
└── usr
    ├── include      #<nano's /usr/include mounted in here>
    └── lib
        └── aarch64-linux-gnu  #<nano's /usr/lib/aarch64-linux-gnu mounted in here>

编译时,出现错误,提示编译器找不到crt1.ocrti.olibpthread.so.0库。

/home/teshan/xcompile/gcc-4.8.5-aarch64/install/bin/../lib/gcc/aarch64-unknown-linux-gnu/4.8.5/../../../../aarch64-unknown-linux-gnu/bin/ld: cannot find crt1.o: No such file or directory
/home/teshan/xcompile/gcc-4.8.5-aarch64/install/bin/../lib/gcc/aarch64-unknown-linux-gnu/4.8.5/../../../../aarch64-unknown-linux-gnu/bin/ld: cannot find crti.o: No such file or directory
/home/teshan/xcompile/gcc-4.8.5-aarch64/install/bin/../lib/gcc/aarch64-unknown-linux-gnu/4.8.5/../../../../aarch64-unknown-linux-gnu/bin/ld: cannot find /lib/aarch64-linux-gnu/libpthread.so.0 inside /home/teshan/xcompile
collect2: error: ld returned 1 exit status

在挂载/usr/lib/aarch64-linux-gnu/usr/include之前,我遇到了错误,提示找不到 Boost 库。由于库文件在挂载的目录中可用,因此它们现在已经消失了。

但是,我所要求的文件crti.ocrt1.o在安装的目录中,就像boost库文件一样。那为什么编译器找不到它们?

$ find -name crti.o -type f
./gcc-4.8.5-aarch64/install/aarch64-unknown-linux-gnu/sysroot/usr/lib/crti.o
./usr/lib/aarch64-linux-gnu/crti.o
$ find -name crt1.o -type f
./gcc-4.8.5-aarch64/install/aarch64-unknown-linux-gnu/sysroot/usr/lib/crt1.o
./usr/lib/aarch64-linux-gnu/crt1.o

我没有要求的libpthread.so.0,但有libpthread.so。我该怎么办?

$ find -name libpthread.so* -type f
./gcc-4.8.5-aarch64/install/aarch64-unknown-linux-gnu/sysroot/usr/lib/libpthread.so
./usr/lib/aarch64-linux-gnu/libpthread.so

TL; DR

这是我的构建脚本

#!/bin/bash

PWD=$(pwd)
export LANG=C
source /opt/ros/melodic/setup.bash

catkin config --extend ${PWD}/opt/ros/melodic/

catkin build -j8 --cmake-args \
-DCMAKE_TOOLCHAIN_FILE=${PWD}/toolchain.cmake \
-DCMAKE_CROSS_COMPILE_PREFIX=${PWD} \
-DRT_LIBRARY=${PWD}/usr/lib/aarch64-linux-gnu/ 

这是我的工具链。cmake

SET(CMAKE_SYSTEM_NAME Linux)

SET(CMAKE_C_COMPILER ${NANO_ROOT_PATH}/gcc-4.8.5-aarch64/install/bin/aarch64-unknown-linux-gnu-gcc)
SET(CMAKE_CXX_COMPILER ${NANO_ROOT_PATH}/gcc-4.8.5-aarch64/install/bin/aarch64-unknown-linux-gnu-g++)

# Below call is necessary to avoid non-RT problem.
SET(CMAKE_LIBRARY_ARCHITECTURE aarch64-linux-gnu)

SET(NANO_ROOT_PATH ${CMAKE_CURRENT_LIST_DIR})
SET(NANO_MELODIC_PATH ${NANO_ROOT_PATH}/opt/ros/melodic)

SET(CMAKE_FIND_ROOT_PATH ${NANO_ROOT_PATH} ${CATKIN_DEVEL_PREFIX})
SET(COMPILER_ROOT ${NANO_ROOT_PATH}/gcc-4.8.5-aarch64/install)

#Have to set this one to BOTH, to allow CMake to find rospack
#This set of variables controls whether the CMAKE_FIND_ROOT_PATH and CMAKE_SYSROOT are used for find_xxx() operations.
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

SET(CMAKE_PREFIX_PATH ${NANO_MELODIC_PATH} ${NANO_ROOT_PATH}/usr)

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${NANO_ROOT_PATH}" CACHE INTERNAL "" FORCE)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${NANO_ROOT_PATH}" CACHE INTERNAL "" FORCE)
SET(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} --sysroot=${NANO_ROOT_PATH}" CACHE INTERNAL "" FORCE)
SET(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} --sysroot=${NANO_ROOT_PATH}" CACHE INTERNAL "" FORCE)

SET(LD_LIBRARY_PATH ${NANO_MELODIC_PATH}/lib)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

#Skip toolchain trying to build a test program first
SET(CMAKE_C_COMPILER_WORKS 1)
SET(CMAKE_CXX_COMPILER_WORKS 1)

set(BOOST_ROOT ${NANO_ROOT_PATH}/usr/include/boost)

set(COMPILER_SYSROOT ${COMPILER_ROOT}/aarch64-unknown-linux-gnu/sysroot)
include_directories(BEFORE SYSTEM ${COMPILER_SYSROOT}/usr/include/)

0 个答案:

没有答案