You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

交叉编译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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:24:58