2013-10-21 7 views
18

Gegeben eine kompilierte lib, gibt es eine Möglichkeit zu sagen, ob es mit /md oder /mt kompiliert wurde nur durch das Betrachten (vielleicht mit dumpbin Werkzeug)?Wie kann ich feststellen, ob eine Lib mit/mt oder/md kompiliert wurde?

Edit: dumpbin /directives foo.lib ist eine Lösung für den Fall, dass die lib nicht mit /GL Schalter kompiliert wurde. Gibt es eine Option, um eine lib Datei zu überprüfen, die auf diese Weise optimiert wurde?

+0

Können Sie die akzeptierte Antwort ändern, da sie nicht mehr funktioniert und weniger Stimmen als die darunter hat? –

Antwort

24

Ja, könnten Sie /DIRECTIVES Option der Verwendung dumpbin um herauszufinden, welche Laufzeitbibliotheken die Objekte in der LIB mit verknüpfen möchten:

dumpbin /directives foo.lib 

Geben Sie für Instanzen der Laufzeitbibliotheken here angegeben. Zum Beispiel könnten Sie sehen:

/DEFAULTLIB:MSVCRTD (Modul kompiliert mit/MDD)

oder

/DEFAULTLIB:MSVCRT (Modul mit/MD kompiliert)

oder

/DEFAULTLIB:LIBCMT (Modul kompiliert mit/MT)

Es wird wahrscheinlich viele /DEFAULTLIB Direktiven geben, so Sie können mit Begriffen wie suchen:

dumpbin /DIRECTIVES foo.lib | find /i "msvcr" 

Hoffe das bringt Sie auf den richtigen Weg.

+0

'/ DEFAULTLIB' ist ein Schalter für den Linker - wie kann ich es mit' dumpbin' ausgeben? – zenpoy

+0

/DEFAULTLIB: MSVCRTD ist ein Beispiel für die Ausgabe von Dumpbin, wie Chris sagte. Es ist auch eine Linker-Anweisung. – ExpatEgghead

13

Eine sehr nette Eigenschaft des Microsoft Compilers ist, dass es die Befehlszeile beibehält, die verwendet wurde, um eine Quelldatei in die OBJ-Datei zu kompilieren. Was Sie finden können, finden Sie zurück, indem Sie auf die .lib-Datei mit, warten Sie auf, Notepad.exe. Suchen Sie einfach nach "cl.exe".

Zum Beispiel ist es das, was ich sehe, wenn ich den Editor auf einer Sample-Bibliothek geöffnet verwenden namens Win32Project1.lib, die ich mit VS2013 gebaut:

C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ bin \ CL.exe cmd -c -ZI -nologo -W3 -WX- -sdl -Od -Oy- -DWIN32 -D_DEBUG -D_LIB -DHELLO_STACKOVERFLOW -D_UNICODE -DUNICODE -Gm -EHs -EHc -RTC1 -MDd - GS -fp: genau -Zc: wchar_t -Zc: forScope -Ycstdafx.h -Fp "c: \ Benutzer \ hpass_000 \ Dokumente \ Visual Studio 2013 \ Projekte \ Win32Project1 \ Debug \ Win32Project1.pch" -Fo "c: \ Benutzer \ hpass_000 \ Dokumente \ Visual Studio 2013 \ Projekte \ Win32Project1 \ Debug \ "-Fd" c: \ Benutzer \ hpass_000 \ Dokumente \ Visual Studio 2013 \ Projekte \ Win32Project1 \ Debug \ vc120.pdb "-Gd -TP -analyze- - Fehlerbericht: Eingabeaufforderung -I "C: \ Programme (X 86) \ Microsoft Visual Studio 12.0 \ VC \ enthalten "-I" C: \ Programme (X 86) \ Microsoft Visual Studio 12.0 \ VC \ atlmfc \ include "-I" C: \ Programme (x 86) \ Windows-Kits \ 8.1 \ Include \ um "-I" C: \ Programme (x86) \ Windows-Kits \ 8.1 \ Include \ shared "-I" C: \ Programme (x86) \ Windows-Kits \ 8.1 \ Include \ WinRT“-X src stdafx.cpp pdb c: \ Users \ hpass_000 \ Dokumente \ Visual Studio 2013 \ Projects \ Win32Project1 \ Debug \ vc120.pdb

Wie Sie sehen können, habe ich mit/MDd

zusammengestellt

Beachten Sie, dass eine .lib mehrere OBJ-Dateien mit möglicherweise unterschiedlichen Einstellungen enthalten kann.Die Suche nach "-mt" und "-md" lässt Sie schnell herausfinden.

+0

Das ist großartig! Ich habe es mit sysinternals "strings.exe" Tool einen Schritt voraus gemacht – zenpoy

+12

Dies scheint nicht mehr wahr, weder von .lib, .obj noch .exe (dh versuchen, Protobuf 2.6.1 in VS2013) –

Verwandte Themen