2010-04-17 61 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