Gibt es eine Möglichkeit, welche Version von Visual Studio, um zu bestimmen wurde verwendet, um eine statische Bibliothek zu kompilieren?

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

Frage

Ich habe eine Sammlung von statischen Bibliotheken (LIB-Dateien) von denen einer mit einer anderen Version von Visual Studio gebaut wurden. Dies verursacht die Code-Generierung eines Projektes, das gegen alle von ihnen Verbindungen scheitern. Gibt es eine Möglichkeit, welche Version von Visual Studio, um zu bestimmen wurde verwendet, um eine statische Bibliothek zu kompilieren?

War es hilfreich?

Lösung

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

Für Debug-Bibliotheken, können Sie

dumpbin /headers program.exe

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

Andere Tipps

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

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

Der Compiler klebt den Pfad des Compilers in der Bibliothek auf Debug-Builds und der Compiler Standard Visual Studio Lage ist unter einem Pfad, der den Text ‚Visual Studio‘ enthält.

So, wie James McNellis' Antwort, funktioniert das auch nur für Debug-Builds und ist weiter eingeschränkt zu Builds, die tatsächlich einen Compiler verwendet, der mit in einem Verzeichnis sitzt 'Visual Studio # ' auf dem Weg .

Ich fand dieses Verfahren vor Jahren durch ein wenig von Serendipity, und es hat noch zum Scheitern verurteilt.

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

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

oder die PDB in einem Hex-Viewer öffnen und für die Zeichenfolge "Microsoft (R) Optimizing Compiler" suchen. Die Version in vier 2-Byte-Hex-Werten wird kurz vor dieser 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.

Wenn die statische Bibliothek in C ++ geschrieben wurde, und wurde mit MSVC 2010 oder einem neueren Version gebaut, eine FAILIFMISMATCH Direktive vom Compiler in die Objektdateien gestellt worden sein.

Ich kann das offizielle Dokument von Microsoft über die FAILIFMISMATCH Richtlinie gefunden, aber es scheint, durch Linker verwendet werden, zu erkennen, Inkompatibilitäten zwischen C ++ Standardbibliothek Versionen.

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

find "FAILIFMISMATCH" xyz.lib

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

Das Ergebnis ähnlich der folgenden sein kann:

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"
Hinweis

Die erste Richtlinie: "_MSC_VER = NNNN". In meiner Beobachtung wird der NNNN immer auf die Compiler-Version übereinstimmen verwendet, um die Objektdatei zu erstellen. In meinem Fall war das xyz.lib erstellen mit MSVC 2015 Update 3, seine C ++ Compiler-Version ist 19.00.24215, so sagen / FAILIFMISMATCH. "_ MSC_VER = 1900" in Objektdatei

Ein Detail Zuordnung zwischen Visual Studio-Version und Microsoft C / C ++ Compiler-Version kann bei hier .

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

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

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

Das wird Ihnen nicht sagen, die verison der Compiler oder der IDE , aber Sie werden die verison der .NET Runtimes erzählen. Sie können oder können nicht die OS-Version wissen müssen.

-Jesse

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top