【问题标题】:Static member in two DLL C++两个 DLL C++ 中的静态成员
【发布时间】:2014-11-24 22:49:08
【问题描述】:

我有一个带有静态成员的类,该成员的定义在 cpp 文件中。

我必须在两个不同的 DLL 中使用相同的成员定义,因此我需要在两个项目中包含 cpp 定义以进行编译。这是制作成员的新“版本”。这意味着 cpp 在两个地方编译,它将有两个定义。

我怎么能在两个 DLL 中只有一个定义。 或者我做错了什么或者我错过了什么?

在.h

class qwerty
{
public:
  static xyz* abc;
};

在.cpp中

xyz* qwerty::abc = new xyz();

在两个 DLL 中,我包含了我需要的 .h 和项目中链接的 .cpp。

谢谢。

【问题讨论】:

标签: c++ static initialization


【解决方案1】:

解决方法是将该静态成员包装到传递它的静态成员函数中。因此:

class qwerty
{
public:
  static xyz* get_abc();
};

在 cpp 文件中(仅在 DLL 中):

xyz* qwerty::get_abc() {
  static xyz inst;
  return &inst;
};

这是 Meyers 的老式单例风格。

N.B.:我希望我不必告诉您传递 C++ 对象或通过模块边界导出类的 ABI 相关危险,对吧?

【讨论】:

  • 不幸的是,这也不起作用 - 编译器需要在内部跟踪变量是否已初始化,并且该跟踪也将在每个 DLL 中重复。
  • 但是...如果函数单独放在第三个 DLL 中,这可以工作。
  • 第三个 DLL 工作了!谢谢!我确实有一个 DLL,但它确实有效。
  • @MarkRansom 只要整个应用程序(exe + DLL)中只有一个静态函数定义,这就是 ODR,毕竟这将起作用。但确实,您可能更愿意创建第三个“帮助”DLL 以使依赖关系发挥作用(或者更“对称”,而不是将唯一定义不对称地转移到一个 DLL,使另一个 DLL 依赖它)。
猜你喜欢
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多