2009-09-11 3 views
20

Ich habe eine Sammlung von statischen Bibliotheken (.lib) Dateien, von denen eine möglicherweise mit einer anderen Version von Visual Studio erstellt wurde. Dies führt dazu, dass die Codegenerierung eines Projekts, das mit allen verknüpft ist, fehlschlägt. Gibt es eine Möglichkeit festzustellen, welche Version von Visual Studio zum Kompilieren einer statischen Bibliothek verwendet wurde?Gibt es eine Möglichkeit festzustellen, welche Version von Visual Studio zum Kompilieren einer statischen Bibliothek verwendet wurde?

+3

Eine bessere Frage zu stellen ist, welche Version des Compilers. Es ist möglich, statische C++ - Bibliotheken ohne die Verwendung von Visual Studio zu kompilieren. – JaredPar

+0

Fair genug. In meinem speziellen Fall sind sie alle mit * einigen * Versionen von Visual Studio kompiliert. Es gibt jedoch eine allgemeinere Frage, die lauert. –

Antwort

20

Für Release-Bibliotheken ist es unwahrscheinlich, dass Sie die Version ermitteln können.

Für Debug-Bibliotheken, können Sie dumpbin:

dumpbin /rawdata:1 library.lib 

Die Assembly-Manifest zu Beginn des Dumps sein soll und wird die Version der CRT enthält die Bibliothek erfordert mit dem vollständigen Pfad zum Compiler entlang verwendet, um die Bibliothek zu erstellen.

Für ausführbare Dateien und DLLs können Sie die Linker-Version mit dumpbin; es ist unter „optional Header-Werte“

dumpbin /headers program.exe 

Vielleicht hat jemand anderes einen Weg kennt die Version für Release-Bibliotheken zu erhalten; Ich bin natürlich auch interessiert, wenn sie es sind.

+0

Können Sie einige Details darüber mitteilen, wo dieses Tool zu finden ist, oder wenn es bei der Visual Studio-Installation nicht standardmäßig verfügbar ist? Von wo können wir es dann erhalten? –

+0

Funktioniert der 'dumpbin/headers program.exe'-Ansatz nicht auch mit Release-Binärdateien? Ich habe es versucht und es hat funktioniert. – stackoverflowwww

5

Ich habe immer so etwas wie (in einem Cygwin Fenster) verwendet:

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

Der Compiler den Pfad des Compilers in der Bibliothek auf Debug-Sticks baut und den Standort Compiler Standard Visual Studio ist unter einem Pfad Dazu gehört der Text "Visual Studio". Wie James McNellis 'Antwort funktioniert dies auch nur für Debug-Builds und ist außerdem auf Builds beschränkt, die tatsächlich einen Compiler verwenden, der in einem Verzeichnis mit' Visual Studio # 'im Pfad sitzt.

Ich fand diese Methode vor Jahren durch ein bisschen Serendipity und es muss noch fehlschlagen.

Dies hat den Vorteil, dass es leicht zu merken ist, wenn Sie mit den Unix-Befehlszeilenwerkzeugen vertraut sind.

-2

Sie geben nicht die Sprache, aber in C# ist die Antwort für das Betriebssystem und .NET-Version zu wissen (im Code zur Laufzeit):

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

Es in ein Äquivalent wäre C Managed ++/CLI

das wird Ihnen nicht sagen, die verison des Compiler oder der IDE, aber Sie werden die verison der .NET Runtimes erzählen. Möglicherweise müssen Sie die Betriebssystemversion nicht kennen.

-Jesse

+0

Dies steht nicht einmal im Zusammenhang mit der gestellten Frage. Obwohl in der Frage keine Sprache angegeben ist (was bei der Frage richtig ist), spricht sie von statischen Bibliotheken. Statische Bibliotheken implizieren nativen Code. Die Frage stellt sich im Wesentlichen die Frage, welche Laufzeitversion in den Binärcode übersetzt wird. Die OS-Version interessiert hier nicht. – IInspectable

3

Wenn Sie die entsprechenden PDB-Dateien haben, dann können Sie die Version des Compilers von dort mit einem Tool wie Pdb Inspector zu sehen.

Oder öffnen Sie die PDB in einem Hex-Viewer und suchen Sie nach der Zeichenfolge "Microsoft (R) Optimizing Compiler".Die Version wird in vier 2-Byte-Hex-Wert sein, kurz bevor diese Zeichenfolge, wie in diesem Beispiel:

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 ........ 

Die Version ist somit HEX 13 00, 00 00, 6E 5D, 00 00, oder 19.0.23918.0.

0

Wenn die statische Bibliothek in C++ geschrieben wurde und mit MSVC 2010 oder neuerer Version erstellt wurde, wurde möglicherweise eine FAILIFMISMATCH-Anweisung vom Compiler in die Objektdateien eingefügt.

Ich kann das offizielle Dokument von Microsoft über die FAILIFMISMATCH-Direktive nicht finden, aber es scheint von Linker verwandt zu werden, um Inkompatibilitäten zwischen C++ - Standardbibliotheksversionen zu erkennen.

können Sie den folgenden Befehl verwenden, um diese Direktiven von einer statischen Bibliothek auszudrucken:

find "FAILIFMISMATCH" xyz.lib 

(oder die Art und Weise nutzen, dass mheyman erwähnt hat, wenn Sie in Cygwin oder msys bevorzugen)

Das Ergebnis kann ähnlich sein:

[email protected] /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" 

Beachten Sie die erste Anweisung: "_MSC_VER = NNNN". In meiner Beobachtung stimmt der NNNN immer mit der Compiler-Version überein, die zum Erstellen der Objektdatei verwendet wurde. In meinem Fall wurde die xyz.lib mit MSVC 2015 Update 3 erstellt, ihre C++ - Compiler-Version ist 19.00.24215, also setzen Sie/FAILIFMISMATCH: "_ MSC_VER = 1900" in die Objektdatei.

Eine Detailzuordnung zwischen Visual Studio-Version und Microsoft C/C++ - Compiler-Version finden Sie at here.