RDK X5交叉编译问题

Index of /TogetheROS/cross_compile_docker/里提供的交叉编译的 docker 编译出来的程序是否能在 LNX6.1.83_PL5.1_V1.1.2 版本下运行

不能只看“哪个 docker 镜像”下结论,关键在镜像里的 sysroot 和你板端 rootfs 是不是同一套用户态环境。内核是 6.1.83 还是别的版本不影响用户态程序,决定能不能跑的是 glibc/libstdc++/TROS 库的版本关系。

先确认镜像选对:X5 是 Ubuntu 22.04 + ROS2 Humble,官方文档给 X5 用的是 pc_tros_ubuntu22.04_v1.0.0.tar.gz;索引里的 pc_tros_v1.0.5.tar.gz 是 X3 Foxy 用的,拿它编出来的东西不能给 X5 用。

然后核对两个条件:

  1. sysroot 与板端版本。文档说明 docker 内 cc_ws/sysroot_docker 对应板端 / 目录,所以可以直接对比:
# docker 内
cat /mnt/test/cc_ws/sysroot_docker/etc/version
# 板端
cat /etc/version
ldd --version

板端 glibc 不低于 sysroot 里的 glibc 时,一般能加载;板端更旧就会在运行时直接报 version 'GLIBC_2.xx' not found(此时说明 docker 里的 sysroot 比板端系统新)。

  1. 若程序链接了 TROS 包(hobot_dnn、dnn_node、hobot_mipi_cam 等),板端必须有对应版本的 TROS 库和消息定义:
source /opt/tros/humble/setup.bash
echo $ROS_DISTRO          # 应为 humble
ros2 pkg list | grep hobot

库/接口版本对不上时,通常不是“跑不起来”,而是启动后找不到库或话题、消息类型不匹配。

如果只是纯 C/C++ 程序、且用到的动态库板端都有不低的新版本,那在 LNX6.1.83_PL5.1_V1.1.2 上基本能跑;要做到严格匹配,最稳的是把该版本板端 rootfs(或对应 SDK 的 rootfs)拷出来当 sysroot,而不是用镜像自带的快照。

补充一句信息:你编的是 TROS 功能包还是普通可执行程序?板端执行 cat /etc/version 输出是什么?有这两点就能判断是版本偏差还是编译方式本身不对。

参考:TROS 源码安装(X5 交叉编译 docker 与流程)、RDK FAQ:交叉编译环境如何配置