不一致的dll链接和dllimport静态数据成员的定义是不允许的

Con*_*tin 8 dllimport dllexport visual-c++

假设我有这两个文件:

Header.h

class DLL ExportClass{
public:
  ExportClass();
  static int test;
};
Run Code Online (Sandbox Code Playgroud)

Source.cpp

#ifdef EXPORT
    #define DLL __declspec(dllexport)
#else
    #define DLL __declspec(dllimport)
#endif

#include "Header.h"

int ExportClass::test = 0;
ExportClass::ExportClass(){
}
Run Code Online (Sandbox Code Playgroud)

我不会定义EXPORT(导入已导出的类与static成员),为什么我会收到这些警告:

1>source.cpp(11): warning C4273: 'test' : inconsistent dll linkage
1>          header.h(4) : see previous definition of 'public: static int ExportClass::test'
1>source.cpp(13): warning C4273: 'ExportClass::ExportClass' : inconsistent dll linkage
1>          header.h(3) : see previous definition of '{ctor}'
Run Code Online (Sandbox Code Playgroud)

而这个错误:

1>source.cpp(11): error C2491: 'ExportClass::test' : definition of dllimport static data member not allowed
Run Code Online (Sandbox Code Playgroud)

如果我定义EXPORT它的工作原理.我有点理解警告,但我想,编译器可以忽略静态变量和ctor,因为整个类都被声明为__declspec(dllimport)无论如何.我想使用相同的代码为__declspec(dllexport)__declspec(dllimport)-但似乎编译stll试图定义标记为这些符号__declspec(dllexport)在他们的声明.解决这个问题的常见做法是什么?

Han*_*ant 20

您期望编译器忽略非常严重的事故.它在类声明中遇到了__declspec(dllimport)属性,它非常明确地声明类实现存在于将在运行时绑定的不同模块中.但是它也遇到了这个定义,完全出乎意料,因为属性契约说它是在一个完全不同的项目中编译的.

生成C4273警告是为了提醒您,在运行时实际要执行的功能是非常不清楚的.有两个,一个忙于编译,另一个在DLL中.实际执行哪一个是一个疯狂的猜测.C4273是1级警告,适合"这几乎肯定是错误的"类别.这是完全不可能的工作没关系,因为有一些预期的功能至少有相同的代码.然而,不会造成麻烦的几率并不大,它只有在函数没有任何改变内部DLL状态的副作用时才能工作.它确实很难诊断错误.

然后它遇到了导出的变量.同样的情况,有两个.这是编译器程序员放下脚本的地方,让代码随机使用一个或另一个不再是可以忽略的东西.那就是无法工作,变量不能具有相同的价值.所以C2491是一个硬错误.

不知道你是怎么进入这个泡菜的,显然你想要旅行的路会让你从陡峭的悬崖上掉下来.