问题描述
我有一个共享库——我们称它为 master。它产生一个或多个从属共享库。从共享库通过接口与主共享库交互,交换 std::string、std::vector 等。 从属共享库的编译时间必须最小化,因为此编译是在客户站点动态完成的。
只要交换的对象不是 STL 容器,一切正常。例如
- master 编译 NonStlObject.cpp 和 NonStlObject.h 并生成全局文本符号 (T)
- 客户端使用 NonStlObject.h 并创建未定义的全局文本符号 (U)
一旦 STL 容器被交换,我就会得到 STL 代码的 1 + numberOfSlaves 副本——以及匹配的编译时间——它们在主节点和从节点中都是弱符号 (W)。
除了包装每个 STL 容器之外,还有什么办法可以避免这种情况吗?
附注。我不想被告知,用于构建交互共享库的编译器版本必须相同。当然必须!
PPS。 extern 模板在应用于 std::vector 时似乎被编译器忽略
解决方法
我最终得到了 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 副本”问题的(我不确定后一个问题首先需要解决)。