24

我确实有一个如下所示的课程:

//.h file
class __declspec(dllimport) MyClass
{
    public:
    //stuff
    private:

    static int myInt;
};

// .cpp file
int MyClass::myInt = 0;

我收到以下编译错误:

error C2491: 'MyClass::myInt' : definition of dllimport static data member not allowed

我应该怎么办?

4

3 回答 3

36

__declspec(dllimport)表示当前代码正在使用实现您的类的 DLL。因此,在 DLL 中定义了成员函数和静态数据成员,在您的程序中再次定义它们是错误的。

如果您尝试为实现此类的 DLL 编写代码(并因此定义成员函数和静态数据成员),那么您需要改为标记该类__declspec(dllexport)

通常为此使用宏。在构建 DLL 时,您定义一个宏BUILDING_MYDLL或类似的。在你的标题中,MyClass你有:

    #ifdef _MSC_VER
    #  ifdef BUILDING_MYDLL
    #    define MYCLASS_DECLSPEC __declspec(dllexport)
    #  else
    #    define MYCLASS_DECLSPEC __declspec(dllimport)
    #  endif
    #endif

    class MYCLASS_DECLSPEC MyClass
    {
        ...
    };

这意味着您可以在 DLL 和使用 DLL 的应用程序之间共享标头。

于 2010-08-16T09:58:50.973 回答
6

MSDN 文档

当您声明一个类 dllimport 时,它的所有成员函数和静态数据成员都会被导入。与 dllimport 和 dllexport 对非类类型的行为不同,静态数据成员不能在定义 dllimport 类的同一程序中指定定义

希望能帮助到你..

于 2010-08-16T09:45:27.203 回答
0

如果您正在导入一个类,那么您正在导入它的所有成员,因此不可能在“客户端”定义任何类成员。应使用 dllexport 关键字代表实现 dll

于 2010-08-16T09:44:41.637 回答