7

新しいVCLアプリケーションでは、コンパイルビルドの操作で同じバイナリファイルとマップファイルが生成されます([プロジェクトにバージョン情報を含める]オプションがオフになっている場合でも、.exeファイルの末尾にわずかな違いがあります-すでに説明しました)。マップファイルは同じバイト単位です。しかし、サードパーティのコンポーネントを追加すると、ビルドとコンパイルによって生成されるバイナリファイルとmap(!)ファイルは大幅に異なります。

Delphiの2つのバージョンでテスト済み:
-バージョン7.0(ビルド8.1)
-CodeGear™RAD Studio 2007バージョン11.0.2902.10471(+ 2007年12月更新)

再現する手順:

  1. 新しいVCLアプリケーションを作成します。おそらく、ネイティブのDelphiコンポーネントを追加します(Standart、Additional、Win32、およびSystemタブのすべてのコンポーネントを試します)。
  2. プロジェクトオプションの[リンカー]タブで[詳細マップファイル]をオンにします。
  3. プロジェクトをビルドします
  4. 出力.exeおよび.mapファイルの名前を変更します(例:project1.exeをproject1b.exeに、project1.mapをproject1b.mapに)。
  5. プロジェクトをコンパイルします
  6. 出力.exeおよび.mapファイルの名前を変更します(例:project1.exeをproject1c.exeに、project1.mapをproject1c.mapに)。
  7. 手順4と6のファイルを比較します(私はWinMerge 2.12.4.0を使用しています)。

わずかに異なる.exeファイルと完全に同一の.mapファイルがあります。次に、すべての手順をもう一度繰り返しますが、プロジェクトのサードパーティコンポーネント(ODAC、DOA、DevExpress、および自作を試します)で使用すると、より多くの異なる.exeファイルと異なる.mapファイルが得られます。

なんで?助言がありますか?

更新
私がこれを見つけた方法とそれが私に興味を持っている理由に関するいくつかの情報:
プロジェクトはMSBuildを使用した単純なスクリプトからビルドされます。プロジェクトにITE(リソース付きのdll)を介して翻訳が追加されたとき、プロジェクトがビルド(スクリプトまたはIDEから)の場合-翻訳されたバージョンが正しく機能しない-ボタンのテキスト、ラベルなどが間違った場所から(文字通り別の場所から)取得されたことがわかりましたボタン、ラベル)。プロジェクトをIDEからコンパイルすると、すべて問題ありません。そこで、ビルドとコンパイルの出力の比較を開始します...

4

3 に答える 3

12

表示されているのは、コンパイラの組み込みの make ロジックの単純なアーティファクトです。ビルドを行うと、利用可能なすべてのソースをビルドするようにコンパイラに指示します。そのため、Delphi は各ソース ファイルを処理し、ソースを見つけた uses リスト内のユニットごとに、そのファイルをビルドします。これを再帰的に行います。コンパイルを実行すると、既存の .dcu ファイルのみが読み込まれ、それらが最新であることが判明した場合は何も実行されません。各 .dcu は uses リストを効果的に「平坦化」するため、実際にはユニットが検出される順序が異なる可能性があります。ユニットは異なる順序で検出およびロードされるため、順番に異なる順序でリンクされます。これが、マップ ファイルの外観が大きく異なる理由です。ソースが同じであれば、ビルドを 2 回続けて行うか、コンパイルを続けて 2 回行うと、マップ ファイルは同じになります。

違いのその他の原因は、よりありふれたものであり、PE ヘッダーのタイム スタンプや、その他のパディングやアラインメントのビットなどが含まれます。

于 2010-01-06T19:03:52.767 に答える
3

私が信じているこの答えには2つの部分があります。

あなたが見ている問題の一部、IIRC は、コンパイラがコンパイル/ビルドを行う前にメモリをゼロにしないことです。したがって、初期化されていないメモリに残っているものはすべて、アライメントの目的で出力のフィラーになります。

また、アプリケーションの pe ヘッダー情報に日時スタンプが含まれていることも覚えているようです。それは毎回違いを引き起こします。

私はこれを確認するのに最適な人物ではありませんが、これは過去の議論から思い出すと思われるものです.

Allen Bauer や Barry Kelly のような人は、おそらくこれについてより良い/より正確な情報を提供できるでしょう.

于 2010-01-06T15:35:48.780 に答える
0

プロジェクトでコンパイラ定義を使用し、それらを変更しただけの場合、コンパイルを実行しても、dcu と結果のモジュール (exe または dll) に変更は表示されません。完全な再構築を行うと、新しく作成された dcu とモジュールでコンパイラ定義が使用されます。

これは、異なる定義を持つ異なるプロジェクトでモジュールを使用し、すべての DCU が同じディレクトリに格納されている大規模なプロジェクト グループで見たことがあります。

Ergo: この場合、コンパイラは定義に対する依存関係を強制しません。

おそらく、同じ問題を見たことがあるでしょう。

于 2010-01-08T15:40:40.410 に答える