将多库项目静态链接到 libstd++?

问题描述 投票:0回答:1

我们正在构建一个由 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++ 静态链接到共享库。不过我至少想测试一下。但也许有更好的选择。

c++ linux gcc shared-libraries
1个回答
0
投票

我们如何解决这个问题并实现我们的目标

有两种方法可以解决这个问题:

  1. 将您的两个库链接到较新的
    libstdc++.so.6
    工具链中的
    libgcc_s.so.1
    C++20

    让最终用户下载这些版本的
    libstdc++
    libgcc_s

    安排最终用户二进制文件链接到这些较新的版本,并在静态链接时间使用
    -L/path/to/new/libs
    并在运行时使用
    -Wl,-rpath=/path/to/new/libs
  2. libProduct
    libHelper
    -static-libstdc++ -static-libgcc
    and 一起链接,隐藏所有
    C++
    符号,除了要使用链接器版本脚本显式导出的符号之外。请参阅此答案

解决方案 1 应该可以工作,但是 C++ ABI 兼容性很难,并且在这方面存在错误。

您已尝试解决方案 2,但如果不隐藏

libstdc++
符号,它就不起作用。

附注请注意,将

libstdc++
等静态链接到您的库中可能会产生许可影响(请咨询您的知识产权律师)。

© www.soinside.com 2019 - 2024. All rights reserved.