静的ライブラリのコンパイルに使用されたVisual Studioのバージョンを判断する方法はありますか?
-
05-07-2019 - |
質問
静的ライブラリ(.lib)ファイルのコレクションがあり、その1つは異なるバージョンのVisual Studioでビルドされている可能性があります。これにより、それらすべてにリンクするプロジェクトのコード生成が失敗します。静的ライブラリのコンパイルに使用されたVisual Studioのバージョンを判断する方法はありますか?
解決
リリースライブラリの場合、バージョンを判別できる可能性は低いです。
デバッグライブラリの場合、 dumpbin :
dumpbin /rawdata:1 library.lib
アセンブリマニフェストはダンプの先頭にある必要があり、ライブラリをビルドするために使用されるコンパイラーへのフルパスとともに、ライブラリに必要なCRTのバージョンが含まれます。
実行可能ファイルおよびDLLの場合、dumpbinを使用してリンカーバージョンを取得できます。 「オプションのヘッダー値」の下にあります
dumpbin /headers program.exe
リリースライブラリのバージョンを取得する方法を他の誰かが知っているかもしれません。もしそうなら、私も確かに興味があります。
他のヒント
常に(cygwinウィンドウで)次のようなものを使用しました:
strings -f *.lib | grep 'Visual Studio'
コンパイラは、ライブラリのコンパイラのパスをデバッグビルドに固定し、Visual Studioのコンパイラのデフォルトの場所は、テキスト「Visual Studio」を含むパスの下にあります。
したがって、James McNellisの答えのように、これはデバッグビルドに対してのみ機能し、パスに「Visual Studio #」を持つディレクトリにあるコンパイラを実際に使用するビルドにさらに制限されます。
私はこの方法を数年前にちょっとした偶然を通して見つけましたが、まだ失敗していません。
これには、Unixコマンドラインツールに精通している場合に覚えやすいという利点があります。
対応する.PDBファイルがある場合は、 Pdbインスペクター。
またはPDBを16進ビューアで開き、文字列「Microsoft(R)Optimizing Compiler」を検索します。バージョンは、この例のように、その文字列の直前に4つの2バイトの16進数値になります。
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 ........
したがって、バージョンはHEX 13 00、00 00、6E 5D、00 00、または19.0.23918.0です。
静的ライブラリがC ++で記述され、MSVC 2010以降のバージョンでビルドされた場合、コンパイラによってFAILIFMISMATCHディレクティブがオブジェクトファイルに配置された可能性があります。
FAILIFMISMATCHディレクティブに関するMicrosoftの公式ドキュメントは見つかりませんが、C ++標準ライブラリバージョン間の非互換性を検出するためにリンカーによって使用されているようです。
次のコマンドを使用して、静的ライブラリからこれらのディレクティブを印刷できます。
find "FAILIFMISMATCH" xyz.lib
(または、cygwinまたはmsysを好む場合は、mheymanが言及した方法を使用してください)
結果は次のようになります。
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"
最初のディレクティブ" _MSC_VER = NNNN"に注意してください。私の観察では、NNNNは常にオブジェクトファイルの作成に使用されたコンパイラバージョンと一致しています。私の場合、xyz.libはMSVC 2015 update 3で作成され、そのC ++コンパイラバージョンは19.00.24215なので、/ FAILIFMISMATCH:" _MSC_VER = 1900"オブジェクトファイル内。
Visual StudioバージョンとMicrosoft C / C ++コンパイラバージョン間の詳細マッピングは、ここで。
言語を指定しませんでしたが、C#では、OSおよび.NETバージョン(実行時のコード内)を知るための答えは次のとおりです。
System.Version osVersion = System.Environment.OSVersion;
System.Version cliVersion = System.Environment.Version;
Managed C ++ / CLIには同等のものがあります
コンパイラまたは IDE のバージョンはわかりませんが、.NETランタイムのバージョンはわかります。 OSのバージョンを知っている必要がある場合もあれば、そうでない場合もあります。
-Jesse