我有一个像

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

我想创建一个包含此类K的共享库(dll)。在库中编译的cpp文件中,我称
int K::a = 0;
int K::b = 0;

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

可能我犯了多个错误,所以我的问题是,我该怎么办
  • 告诉链接器共享库中的静态成员类?
  • 使用在主程序库中实例化的静态类成员吗?

  • PS。我使用Visual Studio 2008 ...

    最佳答案

    一个应该在主应用程序的 header 中使用__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,对于主应用程序不应定义它。

    关于c++ - 共享库中的静态类成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1014538/

    10-11 21:03