使用CMake交叉编译ROS2包时遇“无法生成安全运行时路径”错误求助
问题背景
从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-gnuSome 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中。
问题原因
- 工具链文件中设置的
CMAKE_LIBRARY_PATH直接指向主机的交叉编译目录,而非sysroot内的目标平台目录,导致CMake优先搜索主机目录,找不到库后错误尝试生成该文件。 - 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

