首页 > 解决方案 > 使用 CMake 和 SYSROOT 路径进行交叉编译的问题

问题描述

当使用 CMake 交叉编译 ARM 可执行文件并在工具链文件中设置 CMAKE_SYSROOT 变量时,链接器不会自动查找其他库(显式链接到)所依赖的库,例如zglib. 当不使用工具链文件(因此不交叉编译)时,这些不需要在 target_link_libraries() 中明确提及,但是当使用工具链文件时,它们会这样做,否则总是会出现无法找到的链接器错误。我想了解这是为什么。

我的环境的简要说明:

我尝试了许多组合:设置 CMAKE_LIBRARY_PATH、link_directories 等。但是,唯一成功的选项似乎是在 target_link_libraries() 命令中添加以下内容z dl glib-2.0 pcre:)

以下是错误消息的示例:

<path-to-toolchain>/aarch64-linux-gnu/bin/ld:
 warning: libdl.so.2, needed by <path-to-sharedlib>/lib/libopencv_core.so.4.0.1, not found (try using -rpath or -rpath-link)

接下来是指定库中未定义函数的简短列表。这个错误是针对 的libdl.so.2 not found,还有其他的。

我的错误输出:

/home/brian/workspace/ddpx_xcompile/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/7.4.1/../../../../aarch64-linux-gnu/bin/ld: warning: libdl.so.2, needed by /home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1, not found (try using -rpath or -rpath-link)
/home/brian/workspace/ddpx_xcompile/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/7.4.1/../../../../aarch64-linux-gnu/bin/ld: warning: libpthread.so.0, needed by /home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1, not found (try using -rpath or -rpath-link)
/home/brian/workspace/ddpx_xcompile/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/7.4.1/../../../../aarch64-linux-gnu/bin/ld: warning: libz.so.1, needed by /home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1, not found (try using -rpath or -rpath-link)
/home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1: undefined reference to `pthread_key_create@GLIBC_2.17'
/home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1: undefined reference to `gzeof'
/home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1: undefined reference to `pthread_setspecific@GLIBC_2.17'
/home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1: undefined reference to `pthread_join@GLIBC_2.17'
/home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1: undefined reference to `pthread_getspecific@GLIBC_2.17'
/home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1: undefined reference to `pthread_key_delete@GLIBC_2.17'
/home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1: undefined reference to `pthread_create@GLIBC_2.17'
/home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1: undefined reference to `dlclose@GLIBC_2.17'
/home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1: undefined reference to `gzrewind'
/home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1: undefined reference to `dlopen@GLIBC_2.17'
/home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1: undefined reference to `dladdr@GLIBC_2.17'
/home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1: undefined reference to `gzopen'
/home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1: undefined reference to `dlsym@GLIBC_2.17'
/home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1: undefined reference to `gzclose'
/home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1: undefined reference to `gzgets'
/home/brian/workspace/test/crossbuild/test_rootfs/ddpx-rootfs-05172019/home/nvidia/3rd_party_libs/opencv/install-cxx11/lib/libopencv_core.so.4.0.1: undefined reference to `gzputs'
collect2: error: ld returned 1 exit status
CMakeFiles/imshow.dir/build.make:95: recipe for target 'imshow' failed
make[2]: *** [imshow] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/imshow.dir/all' failed
make[1]: *** [CMakeFiles/imshow.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

我的 Cmake 工具链文件:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(TARGET_FS "/home/brian/workspace/ddpx_xcompile/ddpx-rootfs-05172019"  CACHE STRING "test" FORCE)
set(CMAKE_SYSROOT ${TARGET_FS})

#Tried with and without the ${TARGET_FS} prefix, also tried with all uncommented and all commented
#link_directories(/lib/aarch64-linux-gnu)
#link_directories(/usr/lib)
#link_directories(/usr/lib/aarch64-linux-gnu)
#link_directories(${TARGET_FS}/lib/aarch64-linux-gnu)
#link_directories(${TARGET_FS}/usr/lib)
#link_directories(${TARGET_FS}/usr/lib/aarch64-linux-gnu)

#Did not try too much with these
#set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
#set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${CMAKE_SYSROOT}/lib/aarch64-linux-gnu)

#Tried with two different compiler versions
set(CROSSBIN /home/brian/workspace/ddpx_xcompile/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu)
#set(CROSSBIN /home/brian/workspace/ddpx_xcompile/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu)

set(CMAKE_CXX_COMPILER "${CROSSBIN}/bin/aarch64-linux-gnu-g++")
set(CMAKE_C_COMPILER   "${CROSSBIN}/bin/aarch64-linux-gnu-gcc")
set(CMAKE_AR_COMPILER  "${CROSSBIN}/bin/aarch64-linux-gnu-ar")

#This was also an experiment, no change
#set(CMAKE_PREFIX_PATH ${TARGET_FS})
#list(APPEND CMAKE_PREFIX_PATH ${TARGET_FS}/lib/aarch64-linux-gnu)
#list(APPEND CMAKE_PREFIX_PATH /lib/aarch64-linux-gnu)
#list(APPEND CMAKE_LIBRARY_PATH "/lib/aarch64-linux-gnu")
#list(APPEND CMAKE_LIBRARY_PATH "/usr/lib/aarch64-linux-gnu")

#Tried with the 4 below uncommented or just commented
#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_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

message(STATUS "CMAKE_LIBRARY_PATH: ${CMAKE_LIBRARY_PATH}")

标签: c++cmakearmcross-compilinglinaro

解决方案


推荐阅读