C'è un modo per determinare quale versione di Visual Studio è stata utilizzata per compilare una libreria statica?

StackOverflow https://stackoverflow.com/questions/1411854

Domanda

Ho una raccolta di file di librerie statiche (.lib), uno dei quali potrebbe essere stato creato con una versione diversa di Visual Studio. Ciò sta causando il fallimento della generazione del codice di un progetto che si collega a tutti loro. Esiste un modo per determinare quale versione di Visual Studio è stata utilizzata per compilare una libreria statica?

È stato utile?

Soluzione

Per le librerie di rilascio, è improbabile che tu possa determinare la versione.

Per le librerie di debug, è possibile utilizzare dumpbin :

dumpbin /rawdata:1 library.lib

Il manifest dell'assembly dovrebbe essere all'inizio del dump e conterrà la versione del CRT richiesta dalla libreria insieme al percorso completo del compilatore usato per costruire la libreria.

Per eseguibili e DLL è possibile ottenere la versione del linker usando dumpbin; è sotto " OPTIONAL HEADER VALUES "

dumpbin /headers program.exe

Forse qualcun altro conosce un modo per ottenere la versione per le librerie di rilascio; Sono certamente interessato anche se lo sono.

Altri suggerimenti

Ho sempre usato qualcosa di simile (in una finestra di Cygwin):

strings -f *.lib | grep 'Visual Studio'

Il compilatore inserisce il percorso del compilatore nella libreria su build di debug e la posizione predefinita del compilatore di Visual Studio si trova in un percorso che include il testo "Visual Studio".

Quindi, come la risposta di James McNellis, questo funziona anche solo per build di debug ed è ulteriormente limitato alle build che utilizzano effettivamente un compilatore che si trova in una directory con "Visual Studio # " nel percorso .

Ho trovato questo metodo anni fa attraverso un po 'di serendipità e non ha ancora fallito.

Questo ha il vantaggio che è facile ricordare se si ha familiarità con gli strumenti da riga di comando Unix.

Se hai i file .PDB corrispondenti, puoi vedere la versione del compilatore da lì con uno strumento come Ispettore Pdb .

Oppure apri il PDB in un visualizzatore esadecimale e cerca la stringa "Compilatore di ottimizzazione Microsoft (R)". La versione sarà in quattro valori esadecimali da 2 byte appena prima di quella stringa, come in questo esempio:

000000A060: .. .. .. .. .. .. . ...  .. .. .. .. .. .. 13 00                ..
000000A070: 00 00 6E 5D 00 00 4D 69  63 72 6F 73 6F 66 74 20  ......Microsoft
000000A080: 28 52 29 20 4F 70 74 69  6D 69 7A 69 6E 67 20 43  (R) Optimizing C
000000A090: 6F 6D 70 69 6C 65 72 00  .. .. .. .. .. .. .. ..  ompiler ........

La versione è quindi HEX 13 00, 00 00, 6E 5D, 00 00 o 19.0.23918.0.

Se la libreria statica è stata scritta in C ++ ed è stata creata con MSVC 2010 o versione più recente, una direttiva FAILIFMISMATCH potrebbe essere stata inserita dal compilatore nei file oggetto.

Non riesco a trovare il documento ufficiale di Microsoft sulla direttiva FAILIFMISMATCH, ma sembra essere utilizzato dal linker per rilevare incompatibilità tra le versioni della libreria standard C ++.

È possibile utilizzare il comando seguente per stampare quelle direttive da una libreria statica:

find "FAILIFMISMATCH" xyz.lib

(o usa il modo menzionato da mheyman se preferisci in cygwin o msys)

Il risultato potrebbe essere simile al seguente:

0@   /FAILIFMISMATCH:"_MSC_VER=1900" /FAILIFMISMATCH:"_ITERATOR_DEBUG_LEVEL=0" /FAILIFMISMATCH:"RuntimeLibrary=MD_DynamicRelease" /DEFAULTLIB:"msvcprt" /FAILIFMISMATCH:"_CRT_STDIO_ISO_WIDE_SPECIFIERS=0" /DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"MSVCRT" /DEFAULTLIB:"OLDNAMES"

Nota la prima direttiva: " _MSC_VER = NNNN " ;. A mio avviso, NNNN corrisponde sempre alla versione del compilatore utilizzata per creare il file oggetto. Nel mio caso, xyz.lib è stato creato con l'aggiornamento 3 di MSVC 2015, la sua versione del compilatore C ++ è 19.00.24215, quindi ha inserito / FAILIFMISMATCH: " _MSC_VER = 1900 " nel file oggetto.

È possibile trovare un mapping dettagliato tra la versione di Visual Studio e la versione del compilatore Microsoft C / C ++ qui .

Non hai specificato la lingua, ma in C # la risposta per conoscere la versione del sistema operativo e .NET (nel tuo codice in fase di runtime) è:

System.Version osVersion = System.Environment.OSVersion;
System.Version cliVersion = System.Environment.Version;

Ci sarebbe un equivalente in Managed C ++ / CLI

Questo non ti dirà la versione del compilatore o IDE , ma ti dirà la versione dei runtime .NET. Potrebbe essere necessario o meno conoscere la versione del sistema operativo.

-Jesse

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top