2013-10-21 17 views
18

Dato un lib compilato, c'è un modo per dire se è stato compilato con /md o /mt semplicemente guardandolo (forse con lo strumento dumpbin)?Come sapere se una lib è stata compilata con/mt o/md?

Edit: dumpbin /directives foo.lib è una soluzione per il caso in cui il lib non è stato compilato con /GL interruttore. Esiste un'opzione per ispezionare un file lib ottimizzato in tal modo?

+0

È possibile modificare la risposta accettata poiché non funziona più e ha meno voti rispetto a quella sottostante? –

risposta

24

Sì, si potrebbe usare di dumpbin /DIRECTIVES opzione per trovare quale Runtime Libraries gli oggetti nel Lib vogliono collegare con:

dumpbin /directives foo.lib 

Cercare istanze delle librerie di runtime specificati here. Ad esempio, si potrebbe vedere:

/DEFAULTLIB:MSVCRTD (modulo compilato con/MDD)

o

/DEFAULTLIB:MSVCRT (modulo compilato con/MD)

o

/DEFAULTLIB:LIBCMT (modulo compilato con/MT)

Ci saranno probabilmente molte direttive /DEFAULTLIB, quindi puoi cercare usando termini come:

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

Spero che questo ti metta sulla buona strada.

+0

'/ DEFAULTLIB' è un interruttore per il linker - come posso esportarlo con' dumpbin'? – zenpoy

+0

/DEFAULTLIB: MSVCRTD è un esempio dell'output di dumpbin come indicato da Chris. È anche una direttiva linker. – ExpatEgghead

13

Una funzionalità molto buona del compilatore Microsoft è che conserva la riga di comando che è stata utilizzata per compilare un file sorgente nel file .obj. Che ti permette di ritrovarlo guardando il file .lib con, attendere per esso, Notepad.exe. Basta cercare "cl.exe".

Ad esempio, questo è quello che vedo quando uso il Blocco note aperto in una libreria di campioni di nome Win32Project1.lib che ho costruito con VS2013:

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: preciso -Zc: wchar_t -Zc: forScope -Ycstdafx.h -Fp "c: \ Users \ hpass_000 \ documents \ visual studio 2013 \ Projects \ Win32Project1 \ Debug \ Win32Project1.pch" -Fo "c: \ Users \ hpass_000 \ documents \ visual studio 2013 \ Projects \ Win32Project1 \ Debug \ "-Fd" c: \ Users \ hpass_000 \ documents \ visual studio 2013 \ Projects \ Win32Project1 \ Debug \ vc120.pdb "-Gd -TP -analyze- - errorreport: prompt -I "C: \ Programmi (x86) \ Microsoft Visual Studio 12.0 \ VC \ include "-I" C: \ Programmi (x86) \ Microsoft Visual Studio 12.0 \ VC \ atlmfc \ include "-I" C: \ Programmi (x86) \ Kit di Windows \ 8.1 \ Include \ um "-I" C: \ Programmi (x86) \ Kit di Windows \ 8.1 \ Include \ shared "-I" C: \ Programmi (x86) \ Kit di Windows \ 8.1 \ Include \ WinRT" -X src stdafx.cpp PPB C: \ Users \ hpass_000 \ documenti \ visual Studio 2013 Projects \ Win32Project1 \ Debug \ vc120.pdb \

Come si può dire, ho compilato con/MDd

Fai attenzione che un .lib può contenere più file .obj con possibilmente diverse impostazioni.La ricerca di "-mt" e "-md" ti consente di scoprirlo rapidamente.

+0

È fantastico! L'ho preso un passo avanti con lo strumento "strings.exe" di sysinternal – zenpoy

+12

Questo non sembra essere più vero, né di .lib, .obj né .exe (cioè provare protobuf 2.6.1 in VS2013) –

Problemi correlati