2010-07-22 44 views
0

我使用Visual Studio 2008將一些外部C++代碼編譯到dll,thirdpartycode.dll中。代碼被封裝在extern「C」中。使用Visual Studio 2008從x86編譯x64 dll:無法解析的外部__imp_符號

由於我正在交叉編譯,在我的32位機器上創建一個64位的DLL;我在「配置管理器」中將x64用作「主動解決方案平臺」。

我的thirdpartycode.dll編譯並鏈接成功。 接下來,我想創建另一個dll,其中包含調用thirdpartycode.dll的代碼: wrapper.dll。 正如名稱所示,它是一個簡化對thirdpartycode.dll中複雜API的某些調用的包裝。 然後我打算從C#程序調用wrapper.dll。我的問題是當我嘗試鏈接我的wrapper.dll時,我得到未解決的符號:-(。 對於thirdpartycode.dll中的每個函數,例如「func1」;我得到一個無法解析的外部符號「__imp_func1」 。使用的Dependency Walker我確認thirdpartycode.dll indeeed不出口「FUNC1」。

我待辦事項thirdpartycode.lib中的「其他的依賴」。我已經打開/冗長,可以看到thirdpartycode.lib搜索。

如果我重複這整個過程,但使用x86作爲「主動解決方案平臺」的東西很好用!?

任何想法出了什麼問題?

__imp_前綴來自哪裏? 這有點令人困惑,因爲對於故障排除,我會使用Dependency Walker將來自thirdpartycode.dll的導出符號與使用dumpbin的wrapper.obj中的所需符號進行比較。

在此先感謝您的任何答案!

+0

什麼是未解決的符號名稱?他們是系統功能還是來自第三方代碼(即外部庫)? – rubenvb 2010-07-22 08:38:42

+0

他們來自第三方代碼。 – 2010-07-22 08:59:23

+0

對不起,我忘記提及第三方代碼使用Windows系統庫。 當我在Dependency Walker(depends.exe)中打開它時,我發現一些奇怪的東西:我的dll被標記爲64位。然而,我的DLL依賴於C:\ windows \ system32 \ ntdll.dll和C:\ windows \ system32 \ kernel32.dll這是32位!因此,Dependency Walker給我提供了以下錯誤:「錯誤:由於隱式依賴模塊中缺少導出函數,導致至少有一個模塊導入了未解析的錯誤。錯誤:找到了具有不同CPU類型的模塊。 – 2010-07-23 11:32:28

回答

0

只是爲了驗證,當您將thirdpartycode.lib添加到「其他依賴項」時,您確保將正確的libs位置路徑包含在內?在Linker-> General的「附加庫目錄」部分下。

此外,如果項目採用相同的解決方案,您是否確保構建順序是第三方代碼項目在編碼之前構建的?

+0

是的,是的。也從使用/ VERBOSE的鏈接器的輸出中,我可以看到第三方代碼.lib被搜索。 – 2010-07-23 11:30:16

+0

感謝您的建議JMcCarty,但我認爲必須有其他事情出錯。 – 2010-07-23 11:34:04

0

我遇到了一個類似的問題,通過一個存根庫鏈接到一個64位的dll。它出現在我的32位應用程序鏈接到一個32位dll declspec(dllimport)追加imp到它查找的函數名稱,但只爲64位DLL追加_ imp。例如,「function1()」會變成「_ imp _function1」,並且可以找到我的32位版本的dll,但是當我將64位版本的dll鏈接到我的64位版本的dll中時,位應用程序,我得到的錯誤:

解析外部符號__imp_function ...

注單下劃線追加到__imp而同期32位版本的雙下劃線。當我無法鏈接32位所需的庫時,出現鏈接錯誤:

無法解析的外部符號_ imp _function ...

我可以通過在我的頭文件中添加_到函數名稱(即_function()而不是函數()來解決這個問題。這是一個kludge,但它表明的確, bit declspec(dllimport)與32位declspec(dllimport)進行比較。

我正在使用Visual Studio 2010並鏈接到使用gcc創建的dll。單一的underbar,_ imp,所以也許問題是gcc一貫地在前後使用雙重下劃線,但VS期望32位dll被裝飾與64位dll不同。我還沒有設法在微軟MSDN上找到這個不同的描述。任何人都可以確認在Visual Studio中declspec(dllimport)如何裝飾函數名有64位和32位的區別?

相關問題