如何解决do_prepare_recipe_sysroot阶段的yaml-cpp包冲突问题?
解决Yocto中meta-tegra-community(DeepStream 6.2)与ROS2 Galactic的yaml-cpp依赖冲突问题
解决思路
既然DeepStream 6.2硬依赖yaml-cpp-060,修改它的依赖行不通,那直接让ROS2 Galactic的所有组件都用yaml-cpp-060替代默认的yaml-cpp_0.6.2,利用Yocto的包优先级配置实现,同时保证两者的依赖链正常工作。
具体操作步骤
- 全局指定yaml-cpp的首选提供者
在自定义层的conf/local.conf或者层的conf/distro/include/下的配置文件中添加以下内容:
# 强制所有需要yaml-cpp的包使用yaml-cpp-060 PREFERRED_PROVIDER_yaml-cpp = "yaml-cpp-060" PREFERRED_PROVIDER_yaml-cpp-dev = "yaml-cpp-060" PREFERRED_PROVIDER_yaml-cpp-staticdev = "yaml-cpp-060"
这会让Yocto解析依赖时优先选择yaml-cpp-060版本,覆盖ROS2原本的yaml-cpp_0.6.2。
- 适配ROS2包的依赖声明
部分ROS2包可能硬写了yaml-cpp的依赖名称,需要用.bbappend文件修正:
- 找到ROS2 Galactic中依赖yaml-cpp的recipes(比如
ament_cmake_yaml_cpp、rcl_yaml_param_parser等)。 - 在自定义层中创建对应包的
.bbappend文件(比如ament_cmake_yaml_cpp_*.bbappend),添加:
DEPENDS_remove = "yaml-cpp" DEPENDS_append = "yaml-cpp-060" # 如果用到pkgconfig,同步替换 PKGCONFIG_remove = "yaml-cpp" PKGCONFIG_append = "yaml-cpp-060"
把ROS2包的编译依赖从yaml-cpp切换到yaml-cpp-060。
- 屏蔽冲突的原yaml-cpp包
为彻底避免冲突,在local.conf中添加BBMASK屏蔽原yaml-cpp_0.6.2的recipe:
BBMASK += ":yaml-cpp_0.6.2.bb:"
- 验证库兼容性
yaml-cpp-060的库文件名是libyaml-cpp.so.0.6,和ROS2原本用的yaml-cpp_0.6.2的库文件名完全一致,编译链接时不会出现找不到库的问题。可以提前检查yaml-cpp-060的pkgconfig文件是否安装到${STAGING_DIR_HOST}/usr/lib/pkgconfig/,确保ROS2包能正常找到它。
验证构建
完成配置后,重新运行构建命令:
bitbake xxx-xxxx-core-v0.1.3-unstable
检查是否还存在文件冲突错误,后续可验证DeepStream和ROS2的功能是否正常运行。
内容的提问来源于stack exchange,提问作者Bonggyu Choi
相关产品推荐
相关产品推荐

