如果您有不同的库(我猜是不同的动态库),那么您可能会有一些重复的代码和静态变量。
确切的细节将取决于您正在使用的特定动态库技术。例如,我想说的是,在 Windows DLL 中,您将有重复的代码和变量,但在 Linux SO 中则不会。
无论如何,您应该提供有关操作系统和项目布局的更多详细信息。
UPDATE:啊,但是你的类是一个模板!共享库中的模板实例化是一个奇怪的野兽!为了确保在所有流程中只使用类的一份副本,您必须显式实例化模板并确保此实例化在 SO 中导出,并且从客户端代码中使用它。详细信息因编译器而异,但您可以检查如何std::string
已完成,例如:
在头文件中:
namespace std
{
extern template class basic_string<wchar_t>;
}
在库的源代码中:
namespace std
{
template class basic_string<wchar_t>;
}
当然,您需要提前知道您的模板需要哪些实例化。显然,SO 无法导出使用它一无所知的类型的实例。
UPDATE:啊,但是你有两个不同的库实例化模板...那么如果两个库都将显式实例化定义为extern
共享的 ELF 魔法应该将两个实例合并为一个。
另一个更新:使用模板和共享对象后,通常就可以正常工作了。我现在的猜测是你正在编译库-fvisibility=hidden
或类似的。如果是这样的话,只需要写:
template <class OBJECT>
struct __attribute__((visibility("default"))) Container
{
static int m_member;
};
使模板的特化进入动态符号表,从而避免重复。