Visual Studio 2005のC++プロジェクトで、ソースを変更してなくてもリビルドする度に生成されるバイナリ(.objや.exeや.dll等)の内容が変わってしまうのですが、コンパイラやリンカのオプションを調整する事は可能でしょうか?

また可能ならその方法を教えて欲しいです。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/03/26 11:35:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:khazad-Lefty No.1

回答回数181ベストアンサー獲得回数27

ポイント60pt

C++はよくわからないのですが、

「リビルド」じゃなく「ビルド」すればいいという問題じゃないのでしょうか?

GotDotNet Japan 掲示板

ビルドは前回のビルド以降に変更されたアイテムのみを対象にコンパイルを行い、リビルドは全部のアイテムを対象にコンパイルを行うもの
id:kakatofu

質問の仕方が悪かったようです。

ソースコードが同じなら、リビルドをしたときに全く同じバイナリを出力するようにしたいのです。

2009/03/19 16:47:44
  • id:kakatofu
    typoしてた orz
    ×: コンパイラやリンカのオプションを調整する事
    ○: コンパイラやリンカのオプションで調整する事
  • id:tdoi
    khazad-Lefty さんが回答されている通り、リビルドをした時点で生成ファイルは再度作成されます。というか、そのためのコマンドです。

    rebuildは、

    clean + build

    なので、cleanの時点で生成ファイルが削除され、その後、buildによりファイルが生成されます。

    どのような意図で、上記の疑問が出たのかによっては、アドバイスできるかもしれませんが、現状ですとできません。としか答えられません。

    もし、リビルドしたいんだけど、特定のプロジェクトはリビルドをかけたくないとかとういう事情であれば、依存関係を設定した上で、特定のプロジェクトのみリビルドをかけてあげればよいと思います。

    何かの参考になれば。
  • id:kakatofu
    コメントありがとうございます。
    ビルドとリビルドの違いは分かっています。

    うまく伝えられないので手順を載せてみます。

    1. リビルド(1回目)し出力ファイル a.exe を得る。これを取っておきます。
    2. ソースを変更することなく再度リビルド(2回目)します。1回目と同様に a.exe が出力されます。
    3. 1回目と2回目のa.exeをfcする。これで内容が変わっていることが分かります。

    質問の意図は、これを変えないようなことができるのかが知りたい、です。
  • id:ardarim
    exeに含まれる情報としてはビルド時のタイムスタンプなどの情報も入っていますので、完全にバイナリレベルで一致させることは不可能ではないかと思います。
    http://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/intro.html
  • id:espresso3389
    上記のコメントと微妙に被りますけど、

    どのようなプロジェクトをビルドしているかに依存すると思いますが、__DATE__などのマクロが展開していなければ、問題はビルド時のタイムスタンプだと思われます。ちょっとググった感じでは、下記サイトがわかりやすそうですが、

    http://ruffnex.oc.to/kenji/text/exe_inj/

    などを参照すると明らかにタイムスタンプが挿入されています。

    一方で、clやlinkのオプションに、タイムスタンプを強制的に変更するオプションはなさそうですね。

    パッと見た感じでは、これに対するチェックサムなどはなさそうですから(そもそもバイナリエディタなどで差分表示をしてもタイムスタンプ以外は差分が見つからない)、.NETで厳密名などを付与していないのであれば、Post-Buildの部分などで、直接、ここを書き換えてしまえばいい気がします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません