2014-07-11 30 views
0

該項目建立在Win32平臺上,但不在x64上。LNK2001:爲x64平臺構建時無法解析的外部符號

完整的錯誤消息: dllentry.obj:錯誤LNK2001:無法解析的外部符號 「類CFactoryTemplate * g_Templates」(g_Templates @@ 3PAVCFactoryTemplate @@?A)

的dllentry.cpp兩個平臺上編譯。它包含外部聲明:

extern CFactoryTemplate g_Templates[]; 
extern int g_cTemplates; 

g_Templates [],然後在兩個功能使用:

__control_entrypoint(DllExport) STDAPI DllGetClassObject(__in REFCLSID rClsID, 
    __in REFIID riid, __deref_out void **pv) 
{ 
    ... 
    for (int i = 0; i < g_cTemplates; i++) 
    { 
     const CFactoryTemplate * pT = &g_Templates[i]; 
    } 
} 

DllInitClasses(BOOL bLoading) 
{ 
    ... 
    for (int i = 0; i < g_cTemplates; i++) 
    { 
     const CFactoryTemplate * pT = &g_Templates[i]; 
    } 
} 

我檢查了所有的庫中的項目設置和一切似乎沒問題,使用64位版本。我應該怎麼做才能使項目爲x64平臺構建?

+2

哪裏是定義(不聲明)的g_Templates?是否有可能從x64配置中忽略該文件? – dlf

+0

要找到問題嘗試從行'extern CFactoryTemplate g_Templates [];' – KonstantinL

回答

1

指針您在到一個較早的答案

另外,有效的定義評論說,在myClass.cpp(主我的 項目的類)'CFactoryTemplate * g_Templates = 0;'之後是'int g_cTemplates = 0;'在文件的最高層,在 之後。

您對g_Templates的定義與其聲明不一致。

聲明是

extern CFactoryTemplate g_Templates[]; 

這聲明g_Templates作爲CFactoryTemplate陣列(未知大小的)。但是你的定義如下:

CFactoryTemplates* g_Templates = 0; 

將它定義爲指向CFactoryTemplate,這是不一樣的東西。

因此,您未能提供與聲明相匹配的g_Templates的定義,並且錯誤消息是正確的。

您需要獲得聲明和定義同意。一種方法是編寫

CFactoryTemplates g_Templates[1]; 

創建一個與聲明一致的定義。 (請注意,零長度陣列在C++不允許,所以不是我們創建長度爲1的數組,並在它忽略該元素。)

另一種是聲明更改爲

extern CFactoryTemplates* g_Templates; 
+0

數組衰減到extern聲明中的指針。我使用VC2012進行了測試,並且在另一個模塊中將'extern int g []'與'int * g'匹配時沒有問題。 – dlf

+0

但也許VC是錯誤的,因爲進一步的測試表明,雖然鏈接器接受這個,但兩個'g's最終是不同的東西(並且調試檢查員非常困惑)。 – dlf

+2

@dff數組不會衰減到extern聲明中的指針。它們在左值到右值轉換期間衰減爲指針,並在聲明爲函數參數時衰減,但聲明既不是。 –

0

聲明extern CFactoryTemplate g_Templates[];實際上並未定義數組*名爲g_Templates;它只是表明一個存在於項目的某個地方。你基本上是在告訴編譯器:「不要擔心你不會在任何地方看到這個東西;當它需要鏈接的時候,你可以在不同的模塊中找到它。」除了那顯然是不正確的。我能想到的兩個可能的原因是(1)包含g_Templates的實際定義的文件未包含在x64構建配置中,並且(2)定義(無論它在哪裏)都被#ifdef x86包圍。

要解決這個問題,您需要找到g_Templates的實際定義(可能搜索「CFactoryTemplate g_Templates [」),然後確定在x64構建中省略它的原因。


*技術上講,它被視爲這裏

+0

'刪除'extern' g_templates在sysclock.cpp中定義,另一個DirectShow基類,但只在#ifdef FILTER_DLL,在Win32中不滿足的條件都不是。另一個有效的定義是在myClass.cpp(我的項目的主類)'CFactoryTemplate * g_Templates = 0;'接着是'int g_cTemplates = 0;'在包含文件後面的最高層。 myClass.cpp也可以自行編譯。只有構建不起作用。 –

+0

從原始代碼我收集,你正在做一個DLL和鏈接錯誤發生在那裏。是myClass.cpp包含在該dll中,還是它在一個單獨的exe項目? – dlf

相關問題