C++ 使用CMake和SYSROOT路径交叉编译时出现问题

C++ 使用CMake和SYSROOT路径交叉编译时出现问题,c++,cmake,arm,cross-compiling,linaro,C++,Cmake,Arm,Cross Compiling,Linaro,使用CMake交叉编译ARM可执行文件并在工具链文件中设置CMake_SYSROOT变量时,链接器不会自动查找其他库(显式链接到的库)所依赖的库,例如z和glib。当不使用工具链文件(因此不交叉编译)时,无需在target_link_libraries()中明确提及这些文件,但是当使用工具链文件时,它们会这样做,否则总会出现无法找到的链接器错误。我想了解这是为什么 我的环境简介: 使用LinuxUbuntu16为运行Ubuntu18的arm目标编译 根文件系统从目标压缩并在开发系统上解压缩 L

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

我的环境简介:

  • 使用LinuxUbuntu16为运行Ubuntu18的arm目标编译
  • 根文件系统从目标压缩并在开发系统上解压缩
  • Linaro交叉构建工具链(7.4.1)
  • cmake的工具链文件,定义:cmake_系统根、cmake_CXX_编译器、cmake_C_编译器和cmake_AR_编译器
  • 编译器路径:/home/brian/workspace/ddpx\u xcompile/gcc-linaro-7.4.1-2019.02-x86\u 64\u aarch64-linux-gnu
  • 目标根文件系统路径:/home/brian/workspace/ddpx\u xcompile/ddpx-rootfs-05172019
我尝试了多种组合:设置CMAKE_库路径、链接目录等。但是,唯一成功的选择似乎是在目标链接库()命令中添加以下内容:
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)
我的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}")

libdl
libpthread
通常随编译器及其标准库一起提供。您在哪里有这些库(其确切名称如错误消息中所示:
libdl.so.2
libpthread.so.0
)?@Tsyvarev
/home/brian/workspace/ddpx_xcompile/ddpx-rootfs-05172019/lib/aarch64 linux-gnu/libdl.so.2
,我的工具链位于:
/home/brian/workspace/ddpx\u xcompile/gcc-linaro-7.4.1-2019.02-x86\u-aarch64-linux-gnu
@Tsyvarev:我在编译器的目录中也找到了一个额外的libdl.so.2:
/home/brian/workspace/ddpx\u xcompile/gcc-linaro-7.3.1-2018.05-x86\u-aarch64-linux-gnu/libc/lib/libdl.2在为主机编译时(没有工具链文件),我必须为依赖项OpenCV指定不同的路径。链接器能够解析OpenCV库依赖项(如dl&z)的位置。交叉编译时,OpenCV库的路径位于目标根文件系统内。链接器就是不能找到OpenCV依赖项的路径(在这个简单的例子中是dl&z)?在这种情况下,通过“压缩”根文件系统,然后在主机上解压缩,我是否做错了什么?您显示的所有位置都在您的工具链中使用的sysroot之外。这就是链接器不在那里搜索的原因。库
libdl
libpthread
通常附带编译器及其标准库。您在哪里有这些库(其确切名称如错误消息中所示:
libdl.so.2
libpthread.so.0
)?@Tsyvarev
/home/brian/workspace/ddpx_xcompile/ddpx-rootfs-05172019/lib/aarch64 linux-gnu/libdl.so.2
,我的工具链位于:
/home/brian/workspace/ddpx\u xcompile/gcc-linaro-7.4.1-2019.02-x86\u-aarch64-linux-gnu
@Tsyvarev:我在编译器的目录中也找到了一个额外的libdl.so.2:
/home/brian/workspace/ddpx\u xcompile/gcc-linaro-7.3.1-2018.05-x86\u-aarch64-linux-gnu/libc/lib/libdl.2在为主机编译时(没有工具链文件),我必须为依赖项OpenCV指定不同的路径。链接器能够解析OpenCV库依赖项(如dl&z)的位置。交叉编译时,OpenCV库的路径位于目标根文件系统内。链接器就是不能找到OpenCV依赖项的路径(在这个简单的例子中是dl&z)?在这种情况下,通过“压缩”根文件系统,然后在主机上解压缩,我是否做错了什么?您显示的所有位置都在您的工具链中使用的sysroot之外。这就是链接器不在那里搜索的原因。
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}")