2

2 台の異なるマシンが同一のビルドを生成することを確認しようとしています。環境をできる限り似たものにしようとしましたが、生成された .obj ファイルと .exe ファイルにはまだいくつかの違いがあります。埋め込まれたパスの違いとタイムスタンプを除外できました。また、最小限のコード例 (hello world プログラムが実際に同一のバイナリを生成するように) を保証しました。

現在、一部のオブジェクト ファイルは類似しており、他のファイルは類似していません。diff を使用して異なるものをdumpbin /all見ると、次のような違いがあります。

> COMDAT; sym= "public: static int const std::numeric_limits<long double>::max_exponent" (?max_exponent@?$numeric_limits@O@std@@2HB)

< COMDAT; sym= "public: static int const std::_Locbase<int>::collate" (?collate@?$_Locbase@H@std@@2HB)

の多くでSECTION HEADER。100% 証明したわけではありませんが、それぞれの違いは、他のオブジェクト ファイルからダンプされた出力の別のセクションで発生する行にあるように思えます。そのため、物事は別の順序で行われているようです。(ただし、これは私の現在の仮定にすぎないことに注意してください。間違っている可能性があります。)

ここから先に進む方法とその原因についてのヒントはありますか? ビルド/リンク順?

Microsoft が次のように書いていることも確認しまし

注: 連続するビルドで同じソース ファイルをビルドする場合、Visual C++ が同じバイナリ イメージを生成するという保証はありません。ただし、実行時に EXE (または DLL) がまったく同じように動作し、他のすべての条件が同じであることが保証されています。

しかし、私の特定のケースで何が起こっているのかまだ疑問に思っています。私の場合、同じマシンでの連続したビルドは同一のビルドを提供します。

4

1 に答える 1

2

そのため、バイナリがそのように見える理由を正確に説明することはできませんが、根本的な原因である環境に「予期しない」違いが1つ見つかりました.

ビルド ログには、rc.exe (リソース コンパイラ) の異なるバージョンが記載されていました。VS に付属する Windows キットの一部であることが判明しました。ただし、Visual Studio の 2 つのバージョンをインストールすると、コンパイラとリンカーが分離されている間に rc が共有されます。

コンパイルしなかった他の VS を確実にインストールした後、バイナリを期待どおりに変更しました。

于 2015-12-15T14:37:05.357 に答える