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

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

22
demandé sur Bill Carey 2009-09-11 20:07:44

5 réponses

pour les bibliothèques de publication, Il est peu probable que vous puissiez déterminer la version.

pour les bibliothèques de débogage, vous pouvez utiliser dumpbin :

dumpbin /rawdata:1 library.lib

le manifeste d'assemblage doit être au début du dump et contiendra la version du CRT dont la bibliothèque a besoin ainsi que le chemin complet vers le compilateur utilisé pour construire la bibliothèque.

pour les exécutables et les DLLs, vous pouvez obtenir la version linker utiliser dumpbin; c'est sous "valeurs D'en-tête optionnelles "

dumpbin /headers program.exe

peut-être que quelqu'un d'autre sait comment obtenir la version pour les bibliothèques de publication; je suis certainement intéressé aussi si elles sont.

22
répondu James McNellis 2009-10-09 01:46:42

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 sur les constructions de débogage et L'emplacement par défaut du compilateur de Visual Studio est sous un chemin qui inclut le texte 'Visual Studio'.

donc, comme la réponse de James McNellis, cela ne fonctionne aussi que pour les constructions de débogage et est de plus restreint aux constructions qui utilisent réellement un compilateur qui s'assoit dans un répertoire avec ' Visual Studio # ' dans le chemin d'accès.

j'ai trouvé cette méthode il y a quelques années par un heureux hasard et elle n'a pas encore échoué.

cela a l'avantage qu'il est facile de se rappeler si vous êtes familier avec les outils de ligne de commande Unix.

7
répondu mheyman 2012-06-06 19:10:45

si vous avez la correspondante .Fichiers PDB alors vous pouvez voir la version du compilateur à partir de là avec un outil comme Inspecteur Pdb .

ou ouvrez le PDB dans un Hex viewer et recherchez la chaîne de caractères"Microsoft (R) Optimizing Compiler". La version sera en 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.

5
répondu rustyx 2016-05-19 08:45:36

si la bibliothèque statique a été écrite en C++, et a été construite avec MSVC 2010 ou une version plus récente, une directive FAILIFMISMATCH peut avoir été mise par le compilateur dans les fichiers d'objets.

Je n'ai pas trouvé le document officiel de Microsoft sur la directive FAILIFMISMATCH, mais il semble être utilisé par linker 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'un bibliothèque statique:

find "FAILIFMISMATCH" xyz.lib

(ou utilisez la façon dont mheyman a mentionné si vous êtes en faveur de cygwin ou msys)

le résultat peut être similaire à celui-ci:

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"

Note la première directive:"_MSC_VER=NNNN". D'après mes observations, le NNNN correspond toujours à la version du compilateur utilisée pour créer le fichier objet. Dans mon cas, xyz.lib a été créé avec MSVC 2015 mise à jour 3, sa version C++ compilateur est 19.00.24215, donc il a mis / FAILIFMISMATCH:" _MSC_VER=1900 " in object file.

Un détail de la correspondance entre la version de Visual Studio et Microsoft C/C++ Compilateur version peut être trouvée ici .

0
répondu zevoid 2017-09-05 08:23:03

vous n'avez pas spécifié la langue, mais dans C# la réponse pour connaître la version OS et .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 dans Managed C++/CLI

qui ne vous dira pas la verison du compilateur ou du IDE , mais vous dira la verison des Runtime.net. Vous pouvez ou non avoir besoin de connaître la version du système D'exploitation.

- Jesse

-3
répondu Jesse Chisholm 2012-06-25 22:25:18