2009-01-28 11 views
67

Ich evaluiere etwas undokumentierte Software. Wenn ich ein Beispielprojekt zu bauen, ich bin einen Linker-Fehler erhalten, die wie folgt aussieht:Tools zum Überprüfen von .lib-Dateien?

error LNK2019: unresolved external symbol

Es gibt nicht eine ganze Menge von lib Dateien mit dieser App, so kann ich dieses Problem mit Versuch und Irrtum lösen, aber ich weiß, es gibt eine weitere elegante Weg ist, um dieses Problem zu lösen.

In der Java-Welt würde ich grep FOO * .jar, um das Glas zu finden, und ich bin auf der Suche nach dem C++ Analog. Ich arbeite mit C++ - Code in Visual Studio 2005.

Ich vermute, das lib.exe-Dienstprogramm mit der Option/LIST kann die Informationen erhalten, aber ich war bisher nicht erfolgreich. Es druckt nur dieses:

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

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

Irgendwelche Vorschläge?

Antwort

81

Zunächst müssen Sie wissen, welche Art von Bibliothek Sie betrachten. Einige Bibliotheken enthalten einfach Verknüpfungen für eine DLL (d. H. Importbibliotheken) und andere sind Codeobjekte, die Teil des ausführbaren Bildes werden (d. H. Statische Bibliotheken). Aus der Sicht dieser Ausgabe haben Sie eine DLL-Importbibliothek betrachtet.

Als nächstes wollen Sie das richtige Werkzeug verwenden. Lib.exe wird verwendet, um Objektdateien aus Bibliotheken und was nicht zu extrahieren. Das ist ziemlich genau dasselbe wie das Jar-Dienstprogramm für Java. Microsoft stellt dumpbin.exe bereit, die Informationen aus der Bibliothek ausgibt. Ich sehe, dass LarryF dies bereits erwähnt.

Führen Sie für Importbibliotheken dumpbin.exe -headers foo.lib aus, und leiten Sie sie in eine Ausgabedatei um. Die Ausgabe enthält Snippets für jedes Symbol, das die zugehörige DLL exportiert. Suchen Sie nach Zeilen, die mit " Symbol name :" beginnen. Beachten Sie, dass vor und nach "Symbolname" zwei Leerzeichen stehen, wenn Sie eine exakte Übereinstimmung wünschen. Sie können auch die Ausgabe über findstr, um eine Liste von Symbolen zu erzeugen und diese Datei in eine Text umleiten, wenn Sie etwas wollen, ein wenig schöner betrachten:

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

Die andere Option ist die zugehörige DLL mit depends.exe zu öffnen .

+0

Für alle, die Probleme haben, "dumpbin.exe" von 'Powershell' zu starten - https://StackOverflow.com/questions/477387/Cannot-Find-Dumpbin-Exe/38616596#38616596 – Ralt

15

Mehr als eine Sache kann hier Ihr Problem sein. Ich bin mir nicht sicher, ob ich in der lib-Datei suchen werde, ist der beste Weg, um es zu lösen, IMHO ... Allerdings ist die DUMPBIN.exe wahrscheinlich das Werkzeug, das Sie suchen. Verwenden Sie es über die Befehlszeile, stellen Sie jedoch sicher, dass Ihre Pfade festgelegt sind, oder verwenden Sie die "Visual Studio-Eingabeaufforderung", die VS für Sie in Ihrem VS-Startmenü installiert.

+0

Danke für den Zeiger auf Dumpbin. Ich habe dumpbin/all some.lib> some.dump dann grep'd durch meine Dump-Dateien und fand die Bibliothek, die ich verknüpfen musste. – criddell

+2

+1 für "Visual Studio Command Prompt" Referenz – Steed

8

dies arbeitete mit einer visuellen C 9 LIB ++ auszudrücken:

Dumpbin.exe -headers clangParse.lib | findstr/c: "COMDAT"> clangParse-exports.txt

oder dumpbin.exe -headers clangParse.lib | findstr/c: "sym ="> clangParse-exports.txt

danke d.Shawley

10

Wenn Sie eine DLL und wollen es mit __declspec(dllimport) in Ihrem Code verwenden, können Sie die gewünschte LIB-Datei einfach erstellen, wenn Sie eine DEF-Datei für die DLL haben:

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

die mydll schafft. lib

Dieser Befehl sollte in der Visual Studio SDK-Eingabeaufforderung ausgeführt werden.

kann eine DEF-Datei manuell sehr einfach geschrieben werden, wenn Sie keine haben: Sie öffnen die DLL in Dependency Walker (http://www.dependencywalker.com), wählen Sie „Speichern unter“ -> „Text mit Import/Export-Listen“ und haben die Namen und ordinals aller exportierten Funktionen in einer txt-Datei wie folgt:

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 

der Rest schnell erledigt ist. Erstellen einer DEF Datei, die dieses Format hat:

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 

Die Zahl hinter dem @ ist die Ordnungs.


PD: Dependency Walker können sogar undecorate kryptischen Namen von C++ Exporte wie

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

öffnen Sie Visual Studio-Eingabeaufforderung

dumpbin/all Effects11.lib> D: \ 1. txt

Verwandte Themen