web-dev-qa-db-ja.com

静的ライブラリのコンパイルに使用されたVisualStudioのバージョンを判別する方法はありますか?

静的ライブラリ(.lib)ファイルのコレクションがあり、そのうちの1つが異なるバージョンのVisualStudioでビルドされている可能性があります。これにより、それらすべてに対してリンクするプロジェクトのコード生成が失敗します。静的ライブラリのコンパイルに使用されたVisualStudioのバージョンを特定する方法はありますか?

26
Bill Carey

リリースライブラリの場合、バージョンを特定できる可能性はほとんどありません。

デバッグライブラリの場合は、 dumpbin :を使用できます。

dumpbin /rawdata:1 library.lib

アセンブリマニフェストはダンプの先頭にある必要があり、ライブラリが必要とするCRTのバージョンと、ライブラリの構築に使用されるコンパイラへのフルパスが含まれます。

実行可能ファイルとDLLの場合、dumpbinを使用してリンカーバージョンを取得できます。 「オプションのヘッダー値」の下にあります

dumpbin /headers program.exe

たぶん、他の誰かがリリースライブラリのバージョンを取得する方法を知っています。もしそうなら、私も確かに興味があります。

25
James McNellis

私はいつも(cygwinウィンドウで)次のようなものを使用しました:

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

コンパイラーは、デバッグビルド時にライブラリー内のコンパイラーのパスを固定し、Visual Studioのコンパイラーのデフォルトの場所は、テキスト「VisualStudio」を含むパスの下にあります。

したがって、James McNellisの回答と同様に、これもデバッグビルドでのみ機能し、パスに「Visual Studio 」が含まれるディレクトリにあるコンパイラを実際に使用するビルドにさらに制限されます。

私はこの方法を何年も前に少しの偶然から見つけましたが、まだ失敗していません。

これには、Unixコマンドラインツールに精通している場合に覚えやすいという利点があります。

8
mheyman

対応する.PDBファイルがある場合は、 Pdb Inspector などのツールを使用してそこからコンパイラのバージョンを確認できます。

または、16進ビューアでPDBを開き、「Microsoft(R)OptimizingCompiler」という文字列を検索します。この例のように、バージョンはその文字列の直前に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です。

6
rustyx

静的ライブラリが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アップデート3で作成されたため、C++コンパイラのバージョンは19.00.24215であるため、オブジェクトファイルに/ FAILIFMISMATCH: "_ MSC_VER = 1900"を配置します。

VisualStudioバージョンとMicrosoftC/C++コンパイラバージョンの間の詳細なマッピングは ここで にあります。

0
zevoid