libstdc++ 10 和 11 的 dpkg 版本控制问题

dpkg versioning problem with libstdc++ 10 and 11

我有一个内置于 Ubuntu 21.10 中的 Debian 软件包,由于对 libstdc++6 (>= 11) 的依赖而无法安装。 Raspberry Pi OS 使用 GCC 10.3;所以它只有 libstdc++6 (10.3.x).

我将 Ubuntu 版本切换为使用 GCC 10.3 工具链而不是 GCC 11.2。我已经验证该包是使用 G++-10 构建的,而不是 G++ 或 G++-11。

这适用于我在 Ubuntu 系统上构建的另一个包。它生成了一个包含 libstdc++6 (>= 9) 的 .deb 文件!但是当前的依赖项列表更长,即使在使用 GCC-10.3 构建之后仍然显示 libstdc++6 (>= 11)。

据我所知,所有其他依赖版本都可以在 Raspberry pi 系统上轻松满足;但是失败的 .deb 文件确实有更长的依赖项列表。我可能错了。有没有办法检查我的依赖项是否已拖入 libstdc++6 (11.x)?

我正在使用 CMAKE/CPACK 构建,它会检查构建的二进制文件以自动确定依赖关系。

有没有办法告诉 CPack 请求 libstdc++6(>= 10) 而不是 >= 11?我认为应该没问题,如果版本号有任何意义的话。我认为,使用 G++10 * 构建的二进制文件应该能够 link 对抗 10.x 或 11.x 版本的 libstdc++。

找到了! :-(

问题是由版本化的 .so 文件过时引起的。显然 CPack 查看最终安装位置的二进制文件,而不是构建树中的二进制文件,以确定依赖关系(因为这就是 dpkg-shlibdebs 所做的,以便正确解决太可怕而无法考虑的场景)。当它这样做时,它从以前的安装中选择了一个孤立的 .so 文件!

有问题的文件。

 ToobAmp.so -> ToobAmp.so.0        #fresh install
 ToobAmp.so.0 -> TobbAmp.so.0.1.3  #fresh install
 ToobAmp.so.0.1.3                  #fresh install
 ToobAmp.so.0.0.2          # left over from an old install.

ToobAmp.so.0.0.2 仍然与 libstdc++6 (>11) 有联系,因为它是用 G++-11 构建的。新安装的文件正确引用了 libstdc++6 (>9).

CPack 显然决定它必须包含 (>11),即使 ToobAmp.so.0.0.2 不是包的一部分。

噗。希望它可以节省其他人许多小时的咬牙切齿、麻布和骨灰。

TLDR....

如果您想知道(您可能不会),dpkg-shlibdeps 遍历进入 libstdc++6.so 的每个链接,并将其与每个已知的 public 入口点进行比较libstdc++6.so 的版本,选择满足所有链接请求的最低版本的库。并且必须假设 c++ 标准 headers 对相同的标准 c++ method/object 使用不同的进入 libstdc++6 的入口点,具体取决于您使用的是 g++-10 还是 g++-11。

为什么 ToobAmp.so.0.0.2 会被处理?很难说。 dpkg-shlibdeps 不做; CPack 可以。但是在这一点上大约有七件事出了问题(不应该存在的孤立文件,CPack 分析了一个不应该安装的文件,具有向后版本关系的 .so 文件,一个拜占庭式的 DPKG 解决方案解决了长期的壮观历史标准库中的版本控制问题,linux 不允许您升级编译器或标准库的发行版,&c &c ...)。

恐怖。


针对评论发布的详细信息。

最有可能的违规者标有评论。该命令是必需的,以便我可以使用 cmake 安装。也许 Cpack 执行 命令以及构建包。

CMakeList.txt

.... build several projects...
... install()-ing of various files and directories...



# QUITE POSSIBLY THE DIRECTIVE THAT CAUSES PROBLEMS
# The same command that is invoked in a postinst action.
# cmake install, and  dpkg install both have to install services.

install(
    CODE "execute_process(COMMAND ${CMAKE_INSTALL_PREFIX}/bin/pipedalconfig --install)"
)


set(CPACK_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Robin Davies<rerdavies@gmail.com>") # required
set(CPACK_PACKAGE_VENDOR "Robin Davies")
set(CPACK_PACKAGE_DESCRIPTION "IoT guitar effects pedal for Raspberry Pi, with phone-friendly web interface.")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "IoT guitar effect for Raspberry Pi")
set(CPACK_DEBIAN_PACKAGE_SECTION sound)
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
set(CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION TRUE)
set(CPACK_DEBIAN_PACKAGE_DEPENDS "jackd2, hostapd, dnsmasq" )
#set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "arm64")
set(CPACK_PACKAGING_INSTALL_PREFIX /usr)
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
set (CPACK_STRIP_FILES ON)


set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_CURRENT_SOURCE_DIR}/debian/postinst;${CMAKE_CURRENT_SOURCE_DIR}/debian/prerm")


include(CPack)