我正在创建一个依赖于 ROS 包 ros-noetic-moveit-core 的包。更具体地说,它包含一个链接到libmoveit_robot_model.so
.
libmoveit_robot_model.so
是 ia 的符号链接libmoveit_robot_model.so.1.1.7
,因此libmoveit_robot_model.so.1.1.7
以我的共享库的 NEEDED 部分结束。
但是,当我打包它时,dpkg-shlibdeps 只添加ros-noetic-moveit-core
到 shlibs 依赖项,没有任何版本信息。
当移动它!更新到较新的版本,就像从 1.1.6 更新时一样,库libmoveit_robot_model.so.1.1.7
将被替换为libmoveit_robot_model.so.1.1.8
(例如),并且我的包将不再链接,而 dpkg 不会看到冲突。
如何确保我的包正确告知其依赖项?我看到两个解决方案:
- 找到一种在链接时不包含版本后缀的方法,以便我的包与 MoveIt! 的多个版本兼容,但我不喜欢这个解决方案(特别是因为 MoveIt! 不提供符号文件或事件带有主要版本后缀的符号链接,例如
libmoveit_robot_model.so.1
)。 - 想办法让 dpkg-shlibdeps 找到使用过的 MoveIt 版本!所以我的包与 MoveIt! 一起升级。
如果是 MoveIt! 的错误打包人员,他们可以做什么,在等待包修复期间我可以做什么?
有关 MoveIt! 的更多信息:
- 我在用这个 .deb 包。
- 没有.符号文件。
- 文件 /var/lib/dpkg/info/ros-noetic-moveit-core.shlibs 包含以下内容:
#...
libmoveit_robot_model 1.1.7 ros-noetic-moveit-core
#...
答案1
这确实是一个打包问题(也可以说是一个库定义问题)。在我开始之前,您可以采取以下措施来修复它:您可以shlibs
在debian/shlibs.local
包的源代码中或在/etc/dpkg/shlibs.override
.添加一行表格
libmoveit_robot_model 1.1.7 ros-noetic-moveit-core (>= 1.1.7), ros-noetic-moveit-core (<< 1.1.8)
将您的包与该包的 1.1.7 版本绑定ros-noetic-moveit-core
。
就ros-noetic-moveit-core
其本身而言,它应该将其库放在一个包中,该包的名称反映了包的soname。如果包的每个版本都不向后兼容,则该名称应包含完整版本(因此在包名称及其元数据中会重复)。如果版本 1.1.8 应该是 1.1.7 的直接替代品,那么 soname 应该停止在 1.1 甚至 1。Debian 政策的相关章节描述了不仅与 Debian 相关的最佳实践,关于共享库的章节。这个脚注给出一个命令来计算库的适当包名称.