¿Hay alguna manera de determinar qué versión de Visual Studio se usó para compilar una biblioteca estática?

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

Pregunta

Tengo una colección de archivos de bibliotecas estáticas (.lib), uno de los cuales puede haber sido construido con una versión diferente de Visual Studio. Esto está causando que la generación de código de un proyecto que enlaza contra todos ellos falle. ¿Hay alguna manera de determinar qué versión de Visual Studio se utilizó para compilar una biblioteca estática?

¿Fue útil?

Solución

Para las bibliotecas de versiones, es poco probable que puedas determinar la versión.

Para las bibliotecas de depuración, puede usar dumpbin :

dumpbin /rawdata:1 library.lib

El manifiesto del ensamblado debe estar al principio del volcado y contendrá la versión del CRT que la biblioteca requiere junto con la ruta completa al compilador utilizado para construir la biblioteca.

Para los archivos ejecutables y los archivos DLL, puede obtener la versión del vinculador utilizando el dumpbin; está debajo de " OPCIONAL VALORES DE HEADER "

dumpbin /headers program.exe

Tal vez alguien más sepa de una manera de obtener la versión para las bibliotecas de lanzamiento; Estoy ciertamente interesado también si ellos lo están.

Otros consejos

Siempre he usado algo como (en una ventana de cygwin):

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

El compilador pega la ruta del compilador en la biblioteca en las versiones de depuración y la ubicación predeterminada del compilador de Visual Studio se encuentra en una ruta que incluye el texto 'Visual Studio'.

Entonces, al igual que la respuesta de James McNellis, esto también funciona solo para compilaciones de depuración y está más restringido a las compilaciones que en realidad usan un compilador que se encuentra en un directorio con 'Visual Studio # ' en la ruta .

Encontré este método hace años a través de un poco de serendipity y todavía tiene que fallar.

Esto tiene la ventaja de que es fácil de recordar si está familiarizado con las herramientas de línea de comandos de Unix.

Si tiene los archivos .PDB correspondientes, puede ver la versión del compilador desde allí con una herramienta como Inspector Pdb .

O abra el PDB en un visor hexadecimal y busque la cadena " Microsoft (R) Optimizing Compiler " La versión estará en cuatro valores hexadecimales de 2 bytes justo antes de esa cadena, como en este ejemplo:

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 versión es, por lo tanto, HEX 13 00, 00 00, 6E 5D, 00 00 o 19.0.23918.0.

Si la biblioteca estática se escribió en C ++ y se creó con MSVC 2010 o una versión más reciente, el compilador puede haber colocado una directiva FAILIFMISMATCH en los archivos de objetos.

No puedo encontrar el documento oficial de Microsoft sobre la directiva FAILIFMISMATCH, pero parece que el enlazador lo utiliza para detectar incompatibilidades entre las versiones de la biblioteca estándar de C ++.

Puede usar el siguiente comando para imprimir esas directivas desde una biblioteca estática:

find "FAILIFMISMATCH" xyz.lib

(o use la forma que ha mencionado mheyman si prefiere en cygwin o msys)

El resultado puede ser similar a esto:

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"

Observe la primera directiva: " _MSC_VER = NNNN " ;. En mi observación, la NNNN siempre coincide con la versión del compilador utilizada para crear el archivo objeto. En mi caso, xyz.lib se creó con MSVC 2015 actualización 3, su versión del compilador de C ++ es 19.00.24215, por lo que puso / FAILIFMISMATCH: " _MSC_VER = 1900 " en el archivo objeto.

Se puede encontrar una asignación detallada entre la versión de Visual Studio y la versión del compilador de Microsoft C / C ++ aquí .

No especificó el idioma, pero en C # la respuesta para conocer la versión del sistema operativo y .NET (en su código en tiempo de ejecución) es:

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

Habría un equivalente en C ++ / CLI administrado

Eso no le indicará la versión del compilador o de la IDE , pero le indicará la versión de los tiempos de ejecución de .NET. Puede que necesite o no saber la versión del sistema operativo.

-Jesse

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top