我们正在构建一个由 2 个共享库
libProduct
和 libHelper
组成的项目。 libProduct
取决于libHelper
。我们正在使用一个相当新的 GCC 工具链 (12) 进行 Linux 构建,以便在我们的代码库中利用 C++20 功能。
现在我们需要将我们的库发送给使用旧版 Raspbian/Debian 的用户。首先,他想将他的应用程序链接到
libProduct
,但他也想换出 libHelper
。问题是他使用了一个更旧的工具链——Raspbian 附带的工具链。
我们尝试将我们的库与
-static-libstc++
和 -static-libgcc
链接起来,并希望这会创建或多或少的自包含共享库,但观察结果是:
libHelper
包含许多来自 libstdc++ 的符号 - 这是预期的libProduct
使用 libHelper
中的 libstdc++ 符号,而不是包含自己的符号副本libHelper
,因为他的工具链可能无法在其 libstdc++ 中提供一些所需的符号。我们如何解决这个问题并实现我们的目标:
我知道出于各种原因,不鼓励将 libstdc++ 静态链接到共享库。不过我至少想测试一下。但也许有更好的选择。
我们如何解决这个问题并实现我们的目标
有两种方法可以解决这个问题:
libstdc++.so.6
工具链中的 libgcc_s.so.1
和 C++20
。libstdc++
和 libgcc_s
。-L/path/to/new/libs
并在运行时使用 -Wl,-rpath=/path/to/new/libs
libProduct
和 libHelper
与 -static-libstdc++ -static-libgcc
and 一起链接,隐藏所有 C++
符号,除了要使用链接器版本脚本显式导出的符号之外。请参阅此答案。解决方案 1 应该可以工作,但是 C++ ABI 兼容性很难,并且在这方面存在错误。
您已尝试解决方案 2,但如果不隐藏
libstdc++
符号,它就不起作用。
附注请注意,将
libstdc++
等静态链接到您的库中可能会产生许可影响(请咨询您的知识产权律师)。