gpt4 book ai didi

visual-c++ - 不一致的 dll 链接和 dllimport 静态数据成员的定义不允许

转载 作者:行者123 更新时间:2023-12-04 04:57:10 33 4
gpt4 key购买 nike

假设我有这两个文件:

头文件.h

class DLL ExportClass{
public:
ExportClass();
static int test;
};

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

#include "Header.h"

int ExportClass::test = 0;
ExportClass::ExportClass(){
}

我不会定义 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}'

而这个错误:
1>source.cpp(11): error C2491: 'ExportClass::test' : definition of dllimport static data member not allowed

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

最佳答案

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

生成 C4273 警告是为了提醒您在运行时实际上将执行什么函数非常不清楚。有两个,一个在忙编译,另一个在DLL中。哪个将实际执行是一个疯狂的猜测。 C4273 是 1 级警告,属于“这几乎肯定是错误的”类别。正常工作并非完全不可能,因为人们期望这些函数至少具有相同的代码。然而,不会引起麻烦的可能性并不大,它只有在函数没有任何改变内部 DLL 状态的副作用的情况下才能工作。顺便说一句,很难诊断错误。

然后它遇到了导出的变量。同样的情况,有两个。这就是编译器程序员放弃的地方,让代码随机使用其中一个不再是可以忽略的事情。那永远行不通,变量不能具有相同的值。所以 C2491 是一个硬错误。

不知道你是怎么钻到这个泡菜里的,很明显你要走的路会让你从陡峭的悬崖上掉下来。

关于visual-c++ - 不一致的 dll 链接和 dllimport 静态数据成员的定义不允许,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19926736/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com