【问题标题】:How to avoid multiple copies of the code for std::vector<double>?如何避免 std::vector<double> 的代码的多个副本?
【发布时间】:2021-10-02 18:32:23
【问题描述】:

我有一个共享库——我们称之为主库。它产生一个或多个从属共享库。从共享库通过接口与主共享库交互,交换 std::string、std::vector 等。 由于此编译是在客户站点动态完成的,因此必须尽量减少从属共享库的编译时间。

只要交换的对象不是 STL 容器,一切正常。例如

  • master 编译 NonStlObject.cpp 和 NonStlObject.h 并生成全局文本符号 (T)
  • 客户端使用 NonStlObject.h 并创建未定义的全局文本符号 (U)

在交换 STL 容器后,我最终会得到 1 + numberOfSlaves 个 STL 代码副本——以及匹配的编译时间——它们在主从服务器中都是弱符号 (W)。

除了包装每个 STL 容器之外,还有什么方法可以避免这种情况?

PS。我不想被告知,用于构建交互共享库的编译器版本必须相同。当然必须!

PPS。 extern 模板在应用于 std::vector 时似乎被编译器忽略

【问题讨论】:

    标签: linux c++11 stl linker g++


    【解决方案1】:

    我最终得到了 1 + numberOfSlaves 份代码

    这是您最少的问题。

    更大的问题是,在 C++ 中跨不同版本的编译器实现 ABI 兼容性确实很困难。

    如果您使用 g++-9.0 编译代码,并且您的客户安装了 g++-7.0,那么您的代码很可能根本无法工作。

    您当然可以要求客户安装 9.0,但他们可能无法构建他们的其他程序。

    或者他们可能有 g++-10.0,然后如果/当 std::string 更改其 ABI 并且不再与您的“主”库兼容时,您就会开始看到崩溃。

    除了包装每个 STL 容器之外,还有什么方法可以避免这种情况?

    包装每个 STL 类并通过 C 接口传递它肯定可以解决“ABI 不兼容”问题,但我看不出它如何解决“我有 N+1 个 STL 副本”问题(我不确定后一个问题需要首先解决)。

    【讨论】:

      猜你喜欢
      • 2013-06-13
      • 1970-01-01
      • 2020-12-07
      • 2023-03-25
      • 2016-01-24
      • 1970-01-01
      • 2011-01-13
      • 2018-09-14
      • 1970-01-01
      相关资源
      最近更新 更多