Existe-t-il un moyen de déterminer quelle version de Visual Studio a été utilisée pour compiler une bibliothèque statique?

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

Question

J'ai une collection de fichiers de bibliothèques statiques (.lib), dont l'un peut avoir été créé avec une version différente de Visual Studio. Cela provoque la génération de code d'un projet qui lie tous contre eux pour échouer. Existe-t-il un moyen de déterminer quelle version de Visual Studio a été utilisée pour compiler une bibliothèque statique?

Était-ce utile?

La solution

Pour les bibliothèques de versions, il est peu probable que vous puissiez déterminer la version.

Pour les bibliothèques de débogage, vous pouvez utiliser poubelle :

dumpbin /rawdata:1 library.lib

Le manifeste d'assemblage doit figurer au début du dump et doit contenir la version du CRT requis par la bibliothèque, ainsi que le chemin d'accès complet au compilateur utilisé pour créer la bibliothèque.

Pour les exécutables et les DLL, vous pouvez obtenir la version de l'éditeur de liens à l'aide de dumpbin; c'est sous "VALEURS EN-TÊTE OPTIONNELLES"

dumpbin /headers program.exe

Peut-être que quelqu'un d'autre connaît un moyen d'obtenir la version pour les bibliothèques de versions; Je suis certainement intéressé aussi s'ils le sont.

Autres conseils

J'ai toujours utilisé quelque chose comme (dans une fenêtre cygwin):

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

Le compilateur colle le chemin du compilateur dans la bibliothèque dans les versions de débogage et l'emplacement par défaut du compilateur de Visual Studio se trouve sous un chemin contenant le texte "Visual Studio".

Ainsi, à l'instar de la réponse de James McNellis, cela ne fonctionne que pour les versions de débogage et est limité aux versions qui utilisent réellement un compilateur situé dans un répertoire contenant "Visual Studio # ". .

J'ai trouvé cette méthode il y a des années grâce à un peu de sérendipité et elle n'a pas encore échoué.

Cela présente l'avantage qu'il est facile de se rappeler si vous connaissez les outils de ligne de commande Unix.

Si vous avez les fichiers .PDB correspondants, vous pouvez voir la version du compilateur à partir de là avec un outil comme Inspecteur Pdb .

Ou ouvrez le PDB dans un visualiseur hexadécimal et recherchez la chaîne "Microsoft (R) Optimizing Compiler". La version sera dans quatre valeurs hexadécimales de 2 octets juste avant cette chaîne, comme dans cet exemple:

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 version est donc HEX 13 00, 00 00, 6E 5D, 00 00 ou 19.0.23918.0.

Si la bibliothèque statique a été écrite en C ++ et qu'elle a été créée avec MSVC 2010 ou une version plus récente, une directive FAILIFMISMATCH a peut-être été placée par le compilateur dans les fichiers objet.

Je ne trouve pas le document officiel de Microsoft concernant la directive FAILIFMISMATCH, mais il semble que l'éditeur de liens l'utilise pour détecter les incompatibilités entre les versions de bibliothèque standard C ++.

Vous pouvez utiliser la commande suivante pour imprimer ces directives à partir d'une bibliothèque statique:

find "FAILIFMISMATCH" xyz.lib

(ou utilisez la manière indiquée par mheyman si vous préférez cygwin ou msys)

Le résultat peut être similaire à ceci:

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"

Notez la première directive: "_MSC_VER = NNNN". Dans mon observation, le NNNN correspond toujours à la version du compilateur utilisée pour créer le fichier objet. Dans mon cas, le fichier xyz.lib a été créé avec la mise à jour 3 de MSVC 2015, la version de son compilateur C ++ est 19.00.24215; il a donc placé / FAILIFMISMATCH: & _; _MSC_VER = 1900 " dans un fichier objet.

Vous trouverez un mappage détaillé entre la version de Visual Studio et la version du compilateur Microsoft C / C ++ ici .

Vous n'avez pas spécifié le langage, mais en C #, la réponse à la connaissance du système d'exploitation et de la version .NET (dans votre code à l'exécution) est:

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

Il y aurait un équivalent en Managed C ++ / CLI

Cela ne vous dira pas la version du compilateur ou de l'IDE , mais vous indiquera la version des environnements d'exécution .NET. Il se peut que vous n’ayez pas besoin de connaître la version du système d’exploitation.

-Jesse

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top