2012-03-01 79 views
6

對於背景,我已經遇到過將一箇中等大小的linux代碼庫(編譯成巨大的.so)移植到x64窗口(編譯爲.dll)的問題。我有鏈接器的麻煩。DLL中的未解決的符號錯誤

作爲一個最小的測試用例,如果我創建正好從下面的文件Visual Studio項目:

#include <Windows.h> 
#include <Dbghelp.h> 

void do_stuff(char const * s) 
{ 
    char buffer[4096]; 
    long int len = UnDecorateSymbolName(
    s, 
    buffer, 
    sizeof(buffer), 
    UNDNAME_COMPLETE); 
} 

我設置項目類型爲DLL並構建它,我得到一個錯誤「LNK2001:無法解析的外部符號__imp_UnDecorateSymbolName「。也就是說,該文件編譯正確,但無法鏈接到一個DLL。

我認爲我的目標是讓我的dll鏈接到dbghelp.dll,尤其是因爲(至少在我的系統上)沒有dbghelp.lib這樣的文件。那麼爲什麼它現在試圖解決這個符號,而不是當我的DLL被加載到應用程序?無論如何,它爲什麼不能看到這個功能呢?

要清楚,我已確認我正在構建x64 DLL,並且C:\ Windows \ System32中的dbghelp.dll是x64。

+0

它仍然需要與導入庫dbghelp.lib鏈接;這應該包含在Visual Studio,Platform SDK等中。 – Luke 2012-03-01 20:25:05

回答

11

鏈接到共享庫,Windows中發言的DLL,需要以下條件:

  1. 在編譯時間的報頭文件中:Dbghelp.h
  2. 鏈接時的導入庫:Dbghelp.lib
  3. 運行時DLL:Dbghelp.dll

您顯然有1和3,並且缺少2. Visual Studio附帶的Windows SDK包含導入庫。但是您需要將其作爲附加依賴項添加到項目的鏈接器選項中。

像這樣:

enter image description here

+1

就是這樣。我的windows-search-fu很弱,我的系統*有* dbghelp.lib。將它添加到依賴項就像一個魅力。 – user1243488 2012-03-01 20:34:20

+0

Dbghelp是Windows中較爲神祕的庫之一。已經發布了大量不同的版本,並且許多版本都是在OS的帶外發布的。進入一種情況是非常容易的,在這種情況下,您正在調用開發機器上顯示的功能,但不會出現在普通的香草目標機器上。請小心! – 2012-03-01 20:36:55

+4

或者你可以#pragma評論(lib,「dbghelp.lib」) – 2012-06-15 03:47:58