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

使用CMake交叉编译ROS2包时遇“无法生成安全运行时路径”错误求助

解决ROS2交叉编译至arm64v8时的Python库路径冲突问题

问题背景

从Ubuntu Jammy x86-64主机交叉编译ROS2包到arm64v8平台,已配置sysroot、aarch64编译器和CMake工具链,简单包编译正常,但添加复杂依赖后出现以下警告和编译错误:

CMake Warning at CMakeLists.txt:15 (add_executable):
Cannot generate a safe runtime search path for target my_node because files
in some directories may conflict with libraries in implicit directories:

runtime library [libpython3.10.so] in /usr/lib/aarch64-linux-gnu may be hidden by files in:
  /home/giellamo/roots/usr/lib/aarch64-linux-gnu

Some of these libraries may not be found correctly.

编译错误:

gmake[2]: *** No rule to make target '/usr/lib/aarch64-linux-gnu/libpython3.10.so', needed by 'my_node'. Stop.
gmake[2]: *** Waiting for unfinished jobs....
gmake[1]: *** [CMakeFiles/Makefile2:137: CMakeFiles/my_node.dir/all] Error 2

实际主机/usr/lib/aarch64-linux-gnu目录下无libpython3.10.so,该文件仅存在于sysroot路径/home/giellamo/roots/usr/lib/aarch64-linux-gnu中。

问题原因

  1. 工具链文件中设置的CMAKE_LIBRARY_PATH直接指向主机的交叉编译目录,而非sysroot内的目标平台目录,导致CMake优先搜索主机目录,找不到库后错误尝试生成该文件。
  2. ROS2的Python相关依赖通过pkg-config或FindPython模块配置时,误获取了主机交叉编译目录的路径,而非sysroot内的目标库路径。

解决方案

1. 修正工具链的路径配置

将CMAKE_INCLUDE_PATH、CMAKE_LIBRARY_PATH、CMAKE_PROGRAM_PATH改为基于sysroot的相对路径,确保CMake优先搜索目标平台的文件:

# 替换原路径设置
set(CMAKE_INCLUDE_PATH  $ENV{SYSROOT}/usr/include/aarch64-linux-gnu)
set(CMAKE_LIBRARY_PATH  $ENV{SYSROOT}/usr/lib/aarch64-linux-gnu)
set(CMAKE_PROGRAM_PATH  $ENV{SYSROOT}/usr/bin/aarch64-linux-gnu)

2. 强制Python模块使用sysroot内的库

在工具链文件中添加Python路径的强制设置,避免FindPython模块定位错误:

# 强制指向sysroot中的Python3库
set(Python3_ROOT_DIR $ENV{SYSROOT}/usr)
set(Python3_INCLUDE_DIR $ENV{SYSROOT}/usr/include/aarch64-linux-gnu/python3.10)
set(Python3_LIBRARY $ENV{SYSROOT}/usr/lib/aarch64-linux-gnu/libpython3.10.so)
set(Python3_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(Python3_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

若使用Python2,替换为Python2_*对应变量即可。

3. 配置pkg-config使用sysroot

交叉编译时需让pkg-config优先搜索sysroot内的配置文件,可在工具链文件中添加:

set(ENV{PKG_CONFIG_SYSROOT_DIR} $ENV{SYSROOT})
set(ENV{PKG_CONFIG_PATH} "$ENV{SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig:$ENV{SYSROOT}/usr/share/pkgconfig")

或在执行编译命令前导出环境变量:

export PKG_CONFIG_SYSROOT_DIR=$SYSROOT
export PKG_CONFIG_PATH=$SYSROOT/usr/lib/aarch64-linux-gnu/pkgconfig:$SYSROOT/usr/share/pkgconfig

4. 清理缓存重新编译

删除旧的build、install目录,确保新配置生效:

rm -rf build/ install/ log/
colcon build --cmake-args "-DCMAKE_TOOLCHAIN_FILE=/path/to/your/toolchain.cmake"

验证方法

开启CMake编译日志,检查Python库的搜索路径是否正确:

colcon build --cmake-args "-DCMAKE_TOOLCHAIN_FILE=/path/to/your/toolchain.cmake" --cmake-verbose

确认输出中libpython3.10.so的路径指向sysroot内的目标文件。

内容的提问来源于stack exchange,提问作者PeppeDx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 16:39:21