2009-02-24 16 views
5

C++コンパイラを使用してプロジェクトをビルドすると、ソースコードに変更がなければ、生成されたバイナリが影響を受けないことを確認できますか?私のソースを再コンパイルするたびに、バイナリのmd5チェックサムが影響を受けるように見えます。コンパイル時に何らかの形で生成されたバイナリに影響がありますか?どのようにして再現可能なコンパイル結果を生成できますか?反復可能なオブジェクトコードの生成C++

+1

多分、md5バイナリとは別のバージョンを追跡するのに良い方法でしょうか? –

+0

これは何のために必要ですか? – jalf

答えて

1

makeのような増分ビルドシステムを使用して、ソースが変更されない場合にコードを再コンパイルしないようにします。

コンパイラが同じソースから同じバイナリを作成する可能性があります。コンパイラによって異なりますが、コンパイラによって異なります。ほとんどの場合、現在の時刻が生成されたバイナリのどこかに埋め込まれます。

+0

インクリメンタルビルドは、オブジェクトファイルに追加データを追加することがあります。代わりに、毎回ゼロからビルドする非インクリメンタルビルドを使用することができます。このMSの記事をチェックしてください:http://msdn.microsoft.com/en-us/library/4khtbfyf.aspx – tguclu

+0

@tgucluそれは私のものよりもインクリメンタルな意味です。私の定義では、インクリメンタルビルドシステムは出力オブジェクトに違いはありません。ソースが変更された場合にのみ再構築されます。 –

2

あなたのツールチェーンとOSに大きく依存すると思われます。たとえば、実行可能なヘッダーの1つにタイムスタンプが含まれている場合、結果のMD5が異なることが常にわかります。

あなたが達成しようとしている最終的な結果は何ですか?(つまり、なぜ同じであることが重要なのですか)..

+0

私は主にVisual StudioとXcode/gccの回答を探しています。 私たちは毎日製品を再構築しています。私は確実に2つのビルドの間に何dllが変更されたかを知りたい。バイナリを生成するときにタイムスタンプ情報を使用しないようにコンパイラ/リンカのいくつかのフラグを設定することでこれを行うことはできますか? – user70336

+0

私の知る限りではありません。 – Sean

3

一つは、バイナリを逆アセンブルし、MacOSXの

otool -tV a.out | md5 
ee2e724434a89fce96aa6b48621f7220 

に出力に

例をMD5を実行します。しかし、1はグローバルデータ上にミス...(あまりにも含めるためのパラメータであるかもしれない)ことができます

私はあなたのソースを管理する方法...バイナリをチェックし、MD5の問題に答えると、他の人がについて書いてきたようにシステムを構築していますまた、

を見てのことです
2

Visual Studio用のmd5チェックサムの比較はできません。 Visual Studioの通常のリリースバージョンの.exeファイルには、再コンパイルごとに3つの場所が変更されます。 2つはタイムスタンプで、3つ目はVisual Studioが.exeのバージョンをヘルパーファイルと照合して同期していることを確認するために使用する一意のGUIDです。

3つの変更フィールドをゼロにするツールを書くことは可能かもしれませんが、ファイルを解析するのは簡単ではありません。

また、任意の.dllを呼び出している場合は、私が正しいと思い出すと、生成されたファイルに一意の識別子が追加されます。

デバッグバージョンは別の話です。私は多くの、より多くの違いがあると思います。

関連する問題