交叉编译ROS2时CMake无法找到挂载库的问题求助
问题
我正尝试用CMake为Debian系统交叉编译ROS2。官方模拟交叉编译工具因“付费支持”被弃用,采用第三方方法并修改配置适配树莓派4B,同时开发Python脚本实现跨平台构建自动化。
尽管已指定相关配置选项,CMake仍无法找到已安装的库,同时提示无法找到树莓派上已安装的pkg-config。以下是我的配置文件:
bashrc配置
export ROS_DISTRO=iron export TOOLS=/usr #again, make it extendible by changing the value with dpkg -L cross-colcon-build() { if [ ! "$(ls -A /home/develop/rootfs/)" ]; then echo "WARNING: Your rootfs directory is empty!" echo " Please mount rootfs using e.g. 'sshfs -o follow_symlinks,allow_other -o cache_timeout=115200 pi@[raspberry_pi_ip]:/ /home/develop/rootfs'" echo " or synchronize it with e.g. 'rsync -rLR --safe-links pi@[raspberry_pi_ip]:/{lib,usr,opt/vc/lib} /home/develop/rootfs'" echo " Otherwise, the empty rootfs directory may cause your build to fail!" echo "" fi USERPATH=/home/develop/rootfs #extendible in the future export C_INCLUDE_PATH="\ ${USERPATH}/usr/include:\ ${USERPATH}/usr/include/arm-linux-gnueabihf:\ ${USERPATH}/usr/include/aarch64-linux-gnu" export CPLUS_INCLUDE_PATH="\ ${USERPATH}/usr/include:\ ${USERPATH}/usr/include/arm-linux-gnueabihf:\ ${USERPATH}/usr/include/aarch64-linux-gnu" colcon build \ $@ \ --merge-install \ --cmake-force-configure \ --cmake-args \ --compile-no-warning-as-error\ -DCMAKE_TOOLCHAIN_FILE=/home/develop/toolchain.cmake \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ -DTHIRDPARTY=ON \ -DBUILD_TESTING:BOOL=OFF \ -DRUN_HAVE_STD_REGEX=1 }
toolchain.cmake文件
#This sucks message("Toolchain file loaded with path: $ENV{TOOLS}") # set from .bashrc set(tools $ENV{TOOLS}) set(rootfs_dir /home/develop/rootfs/) set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_VERSION 1) set(CMAKE_SYSTEM_PROCESSOR aarch64) set(CMAKE_LIBRARY_ARCHITECTURE aarch64-linux-gnu) set(CMAKE_CROSSCOMPILING 1) #set(CMAKE_FIND_ROOT_PATH /home/develop/ros2_ws/install) set(CMAKE_FIND_ROOT_PATH ${rootfs_dir} /home/develop/ros2_ws/install) set(CMAKE_PREFIX_PATH ${rootfs_dir}) set(CMAKE_SYSROOT ${rootfs_dir}) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a+crc -mtune=cortex-a72 -ftree-vectorize -O2 -pipe -fomit-frame-pointer") # if 32 bit -latomic set(CMAKE_C_FLAGS= "${CMAKE_C_FLAGS} -march=armv8-a+crc -mtune=cortex-a72 -ftree-vectorize -O2 -pipe -fomit-frame-pointer") ## Compiler Binary SET(BIN_PREFIX ${tools}/bin/aarch64-linux-gnu) #SET(BIN_PREFIX ${tools}/bin/aarch64-none-elf) SET (CMAKE_C_COMPILER ${BIN_PREFIX}-gcc) SET (CMAKE_CXX_COMPILER ${BIN_PREFIX}-g++ ) SET (CMAKE_LINKER ${BIN_PREFIX}-ld CACHE STRING "Set the cross-compiler tool LD" FORCE) SET (CMAKE_AR ${BIN_PREFIX}-ar CACHE STRING "Set the cross-compiler tool AR" FORCE) SET (CMAKE_NM {BIN_PREFIX}-nm CACHE STRING "Set the cross-compiler tool NM" FORCE) SET (CMAKE_OBJCOPY ${BIN_PREFIX}-objcopy CACHE STRING "Set the cross-compiler tool OBJCOPY" FORCE) SET (CMAKE_OBJDUMP ${BIN_PREFIX}-objdump CACHE STRING "Set the cross-compiler tool OBJDUMP" FORCE) SET (CMAKE_RANLIB ${BIN_PREFIX}-ranlib CACHE STRING "Set the cross-compiler tool RANLIB" FORCE) SET (CMAKE_STRIP {BIN_PREFIX}-strip CACHE STRING "Set the cross-compiler tool RANLIB" FORCE) # ABOVE ADDED AS TEST set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH) set(PYTHON_SOABI cpython-311m-aarch64-linux-gnu) set(CMAKE_COMPILE_WARNING_AS_ERROR OFF)
编译错误信息
CMake Error at /home/develop/rootfs/lib/aarch64-linux-gnu/cmake/draco/draco-targets.cmake:83 (message): The imported target "draco::draco_static" references the file "/usr/lib/aarch64-linux-gnu/libdraco.a" but this file does not exist. Possible reasons include: * The file was deleted, renamed, or moved to another location. * An install or uninstall procedure did not complete successfully. * The installation package was faulty and contained "/home/develop/rootfs/lib/aarch64-linux-gnu/cmake/draco/draco-targets.cmake" but not all the files it references.
另外,CMake提示无法找到树莓派上已安装的pkg-config。我对CMake了解有限,已尝试修改路径、添加前缀、手动复制库目录等方法但未解决,希望找到解决方案,同时想了解CMAKE_FIND_ROOT_PATH与CMAKE_SYSROOT的区别。
解决方案
1. 修复draco库路径问题
draco的CMake配置文件使用了绝对路径/usr/lib/aarch64-linux-gnu/libdraco.a,交叉编译时需要让CMake自动重映射到rootfs目录。在toolchain.cmake中添加以下配置:
# 强制CMake仅在rootfs内查找头文件和库 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # 明确指定cmake配置文件的搜索路径 set(CMAKE_PREFIX_PATH "${rootfs_dir}/usr/lib/aarch64-linux-gnu/cmake" "${CMAKE_PREFIX_PATH}")
同时检查rootfs是否同步了树莓派上的libdraco.a,如果缺失,重新执行同步命令:
rsync -rLR --safe-links pi@[raspberry_pi_ip]:/usr/lib/aarch64-linux-gnu/libdraco.a /home/develop/rootfs/usr/lib/aarch64-linux-gnu/
2. 修复pkg-config找不到的问题
交叉编译时需要指定目标系统的pkg-config路径,在toolchain.cmake中添加:
# 重置pkg-config环境变量,指向rootfs内的配置 set(ENV{PKG_CONFIG_DIR} "") set(ENV{PKG_CONFIG_LIBDIR} "${rootfs_dir}/usr/lib/aarch64-linux-gnu/pkgconfig:${rootfs_dir}/usr/share/pkgconfig") set(ENV{PKG_CONFIG_SYSROOT_DIR} "${rootfs_dir}")
确保树莓派上已安装pkg-config,且相关配置文件已同步到rootfs。
3. 修复toolchain.cmake中的语法错误
配置文件存在两处语法错误,修改如下:
# 去掉CMAKE_C_FLAGS后的等号 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a+crc -mtune=cortex-a72 -ftree-vectorize -O2 -pipe -fomit-frame-pointer") ## Compiler Binary SET(BIN_PREFIX ${tools}/bin/aarch64-linux-gnu) #SET(BIN_PREFIX ${tools}/bin/aarch64-none-elf) SET (CMAKE_C_COMPILER ${BIN_PREFIX}-gcc) SET (CMAKE_CXX_COMPILER ${BIN_PREFIX}-g++ ) SET (CMAKE_LINKER ${BIN_PREFIX}-ld CACHE STRING "Set the cross-compiler tool LD" FORCE) SET (CMAKE_AR ${BIN_PREFIX}-ar CACHE STRING "Set the cross-compiler tool AR" FORCE) # 补全$符号 SET (CMAKE_NM ${BIN_PREFIX}-nm CACHE STRING "Set the cross-compiler tool NM" FORCE) SET (CMAKE_OBJCOPY ${BIN_PREFIX}-objcopy CACHE STRING "Set the cross-compiler tool OBJCOPY" FORCE) SET (CMAKE_OBJDUMP ${BIN_PREFIX}-objdump CACHE STRING "Set the cross-compiler tool OBJDUMP" FORCE) SET (CMAKE_RANLIB ${BIN_PREFIX}-ranlib CACHE STRING "Set the cross-compiler tool RANLIB" FORCE) # 补全$符号,修正注释 SET (CMAKE_STRIP ${BIN_PREFIX}-strip CACHE STRING "Set the cross-compiler tool STRIP" FORCE)
CMAKE_FIND_ROOT_PATH与CMAKE_SYSROOT的区别
- CMAKE_SYSROOT:指定编译器的系统根目录,给gcc/g++添加
--sysroot参数,让编译器自动在该目录下查找头文件、库文件,属于底层的路径重写。 - CMAKE_FIND_ROOT_PATH:指定CMake查找库、头文件、包配置文件时的根路径列表,配合
CMAKE_FIND_ROOT_PATH_MODE_*变量控制查找优先级,是给CMake的find_package、find_library等命令用的搜索路径。
内容的提问来源于stack exchange,提问作者n3trunner
相关产品推荐
相关产品推荐

