C++ 使用CMake和SYSROOT路径交叉编译时出现问题
使用CMake交叉编译ARM可执行文件并在工具链文件中设置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
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
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}")