【问题标题】:Static class members in shared library共享库中的静态类成员
【发布时间】:2010-11-04 02:42:32
【问题描述】:

我有一门课

class K {
  static int a;
  static int b;
}

我想创建一个包含此类 K 的共享库 (dll)。在我调用的库中编译的 cpp 文件中

int K::a = 0;
int K::b = 0;

实例化静态变量。 dll 编译时没有错误,但是当我使用该库时,我得到成员 K::aK::b 的未解决的外部符号错误。在我想使用它的主程序中,我在类 K 的声明中包含相同的头文件,唯一的区别是我使用 class __declspec( dllexport ) K { ... } 的库和主程序 class K { ... }

可能我犯了不止一个错误,所以我的问题是,我该怎么做

  • 告诉链接器共享库中的静态成员类?
  • 在主程序中使用库中实例化的静态类成员?

PS。我使用 Visual Studio 2008...

【问题讨论】:

    标签: c++ visual-studio dll shared-libraries unresolved-external


    【解决方案1】:

    静态链接库而不是动态链接。

    或者在 DLL 中添加一个返回值的全局函数。

    【讨论】:

      【解决方案2】:

      应该在主应用程序的标题中使用__declspec( dllimport )

      所以这是解决方案。头文件(包含在库和主应用程序中)是:

      #ifdef COMPILE_DLL
      #define DLL_SPEC __declspec( dllexport )
      #else
      #define DLL_SPEC __declspec( dllimport )
      #endif
      
      class DLL_SPEC K {
         static int a;
         static int b;
      }
      

      库中的cpp文件包含:

      int K::a = 0;
      int K::b = 0;
      

      要编译库,必须定义宏 COMPILE_DLL,对于主应用程序不应该定义它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-27
        • 2015-05-09
        • 2018-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-15
        • 2011-01-31
        相关资源
        最近更新 更多