2009-01-28 54 views
67

我正在評估一些未經證實的軟件。當我建立一個樣本項目,我收到看起來像一個鏈接錯誤:檢查.lib文件的工具?

error LNK2019: unresolved external symbol

不會有一大堆的這個程序LIB文件,這樣我就可以嘗試和錯誤解決這個問題,但我知道還有更多優雅的方法就是解決這個問題。

在java世界中,我會grep FOO * .jar找到jar,我正在尋找C++模擬。我正在Visual Studio 2005中使用C++代碼。

我懷疑使用/ LIST選項的lib.exe實用程序可以獲取信息,但到目前爲止我一直沒有成功。它只是打印此:

 
Microsoft (R) Library Manager Version 8.00.50727.762 
Copyright (C) Microsoft Corporation. All rights reserved. 

granite50.dll 
granite50.dll 
granite50.dll 
granite50.dll 
... 

有什麼建議嗎?

回答

81

首先,您需要知道您正在查看哪種類型的庫。一些庫僅包含DLL的鏈接(即,導入庫),而其他庫是成爲可執行映像(即,靜態庫)一部分的代碼對象。從輸出的外觀來看,您正在查看一個DLL導入庫。

接下來你想使用正確的工具。 Lib.exe用於從庫中提取目標文件,而不是。這與Java的jar實用程序非常相似。 Microsoft提供dumpbin.exe,它將從庫中轉儲信息。我看到LarryF已經提到了這一點。

對於導入庫,運行dumpbin.exe -headers foo.lib並將其重定向到輸出文件。輸出將包含相關DLL導出的每個符號的片段。搜索從" Symbol name :"開始的行。請注意,如果您想要完全匹配,則在「符號名稱」前後有兩個空格。您也可以通過findstr運行輸出生成的符號列表,並重定向到一個文本文件,如果你想要的東西更好一點看:

dumpbin.exe -headers foo.lib | findstr /c:" Symbol name :" > foo-exports.txt 

另一種選擇是與depends.exe打開相關的DLL 。

15

不止一件事可能是你的問題在這裏。我不確定在lib文件中查找將是解決它的最好方法,恕我直言...但是,DUMPBIN.exe可能是您正在尋找的工具。在命令行中使用它,但要確保你的路徑已經設置好,或者在你的VS開始菜單中使用VS爲你安裝的「Visual Studio命令提示符」。

+0

感謝指向dumpbin的指針。我做了dumpbin/all some.lib> some.dump然後grep'd通過我的轉儲文件,並找到我需要鏈接的庫。 – criddell 2009-01-28 19:02:54

+2

+1「Visual Studio命令提示符」參考 – Steed 2012-09-10 17:34:37

8

這與一個Visual C++工作表示9的.lib:

DUMPBIN.EXE -headers clangParse.lib | findstr/c:「COMDAT」> clangParse-exports.txt

或 dumpbin.exe -headers clangParse.lib | findstr/c:「sym =」> clangParse-exports.txt

謝謝d。shawley

10

如果你有一個DLL,並希望在你的代碼中使用它__declspec(dllimport)你可以輕鬆地創建所需的LIB文件,如果您對DLL DEF文件:

lib /def:mydll.def /nologo /machine:x86 

它創建MYDLL。 lib

該命令應該在Visual Studio SDK命令提示符中運行。

DEF文件可以被寫入手動極爲容易,如果你沒有一個: 您在打開DLL DependencyWalkerhttp://www.dependencywalker.com),選擇「另存爲」 - >「與導入/導出列表文本」和有名稱序在這樣一個txt文件中的所有導出函數

Export Ordinal  Hint   Function       Entry Point 
------ ----------- ----------- -------------------------------- ----------- 
[C ] 2 (0x0002) 1 (0x0001) gsasl_base64_from     0x000024F0 
[C ] 3 (0x0003) 2 (0x0002) gsasl_base64_to     0x000024A0 
[C ] 4 (0x0004) 3 (0x0003) gsasl_callback     0x000018B0 
[C ] 5 (0x0005) 4 (0x0004) gsasl_callback_hook_get   0x00001900 
[C ] 6 (0x0006) 5 (0x0005) gsasl_callback_hook_set   0x000018F0 
[C ] 7 (0x0007) 6 (0x0006) gsasl_callback_set    0x000018A0 
[C ] 8 (0x0008) 7 (0x0007) gsasl_check_version    0x00001870 
[C ] 9 (0x0009) 8 (0x0008) gsasl_client_mechlist    0x00001E20 
[C ] 10 (0x000A) 9 (0x0009) gsasl_client_start    0x00001F40 

剩下的就是迅速完成。 創建DEF文件具有這種格式:

EXPORTS 
gsasl_base64_from @2 
gsasl_base64_to @3 
gsasl_callback @4 
gsasl_callback_hook_get @5 
gsasl_callback_hook_set @6 
gsasl_callback_set @7 
gsasl_check_version @8 
gsasl_client_mechlist @9 
gsasl_client_start @10 
gsasl_client_suggest_mechanism @11 

的@後面的數字爲序。


PD: DependencyWalker甚至可以去除裝飾神祕的像

[email protected]@[email protected] --> int Foo(int, int). 
2

打開Visual Studio命令C++出口的名稱提示

DUMPBIN /所有Effects11.lib> d:\ 1。 txt