2010-04-17 79 views
3

我有一个相当大的Core项目,我正在努力,我试图调整它使用我建立的DLL引擎,我得到了一堆错误,如:C++ DLL链接UnResolved Externals

解析外部符号“私人:静态类

当包括一些从核心DLL中的报头的,类是通过__declspec(dllexport)的出口,但与静态成员的任何标头抛出错误的crapload关于静态成员

这是一个相当大的项目,我不能完全运行去除每个静态我看到的班级成员,反正有这种事情吗?

多数民众赞成在导入类的一个基本的例子:

class __declspec(dllexport) MyClass 
{ 
    public: 
     static bool m_someVar; 
} 

为了清楚起见,我只是想解决m_someVar定义/声明(忘记项)中的类实现文件

+1

灿你向我们展示_exact_错误,最好是一些相应的代码? – 2010-04-17 08:37:24

+0

我添加了一个基本的类示例,错误代码几乎相同: 5> MyFile.obj:错误LNK2001:无法解析的外部符号“private:static unsigned char MyClass :: m_someVar”(?m_someVare @ MyClass @@ 0EA) (以上例为例) – Undawned 2010-04-17 08:52:45

回答

5

当你编译Core你想这些功能是dllexport;但是,编译该DLL时,您希望它们是dllimport。在你的情况下,你总是将它们定义为dllexport,因此,当你链接DLL时,它会抱怨你已经声明了一个函数(甚至说你会导出它)而没有定义它。

解决方案很简单。对于功能

#ifndef I_AM_A_DLL 
#define EXPORT __declspec(dllexport) 
#define IMPORT __declspec(dllimport) 
#else 
#define EXPORT __declspec(dllimport) 
#define IMPORT __declspec(dllexport) 
#endif 

使用EXPORT的功能在CoreIMPORT在外部DLL:除了手动__declspec ING的基础上,无论你的Core或DLL创建宏

class EXPORT MyClass 
{ 
    public: 
     static bool m_someVar; 
} 
0

也许一个愚蠢的问题,但你是在什么地方定义它?您的定义将看起来像:

bool MyClass::m_someVar = false; 
+0

是的,这是在类的实现文件中完成的。 – Undawned 2010-04-17 17:36:15

2

使用您的片段,并运行DUMPBIN.EXE /对DLL出口产生这样的输出:

1 0 0001107D [email protected]@[email protected]@@Z = @ILT+120([email protected]@[email protected]@@Z) 
2 1 00017000 [email protected]@@2_NA = [email protected]@@2_NA (public: static bool MyClass::m_someVar) 

注意的静态成员的出口怎么会出现,但有与你的名字完全不同。如果我通过undname.exe运行您的导出名称,我会得到:

Undecoration of :- "[email protected]@@0EA" 
is :- "private: static unsigned char MyClass::m_someVare" 

请注意区别。你的目标项目中有一个邪恶的宏。加上这头文件解决您的问题:

#undef bool 

这可能有一些副作用:)

+0

不太确定我遵循,在我的项目中使用的宏基本上是SOME_DLL_EXPORT __declspec(dllexport) – Undawned 2010-04-17 17:43:46

+0

@Undawned:否,它是目标项目中使用的宏。在其中一个头文件中查找“#define bool unsigned char”。这个宏把你的类声明搞砸了。 – 2010-04-17 17:52:58