1

ライブラリ (DPK/ビジュアル コントロール) を使用するプログラムがあります。ライブラリはデバッグ モードでコンパイルされました。これは、最適化がオフ、範囲チェックがオンなどを意味します。ライブラリは「必要に応じて再構築」に設定されています。私はそれを再配布するつもりはありません (内部使用のみ)。

プログラムを「リリース」モードでコンパイルするとどうなりますか? ライブラリに含まれるコードは自動的に「リリース」モードに再コンパイルされますか? または、最初に DPK をロードしてライブラリを「リリース」モードで再コンパイルする必要がありますか?


更新:
「必要に応じて再ビルドする」に関連する Embarcadero のヘルプには、「必要に応じてパッケージをビルドする」というすべての説明があります。これは、「プログラムがリリース モードでコンパイルされている場合、ライブラリを再コンパイルする必要があるため、代わりに行う」と解釈します。私の解釈も…聖書的ですか?


この実験は、(上記の条件で) ライブラリに含まれるコードが、DPK の設定ではなく DPR の設定に基づいて EXE にコンパイルされることを示しています。

コンパイラは、PAS ファイルを再コンパイルするときに DPK ファイルを気にしません (DPK が IDE に読み込まれていない場合にのみ適用されます)。**

ここに (すべてのシステムで簡単に再現できる) 証明があります: 私のプログラムを Prog.DPR (Prog.pas を含む) とライブラリ Lib.DPK (LibUnit.pas を含む) と呼びましょう。ライブラリには、TMyPanel ビジュアル コントロールが含まれています。DPR はリリース モードです。DPK はデバッグ モードです。

I install the library. I exit the library ('Close all').
I load the DPR in IDE, I also load LibUnit (Attention: I load only the unit, not the DPK)
I put TMyPanel on my program's form.
The LibUnit is automatically added to the USES clause on my program.
I edit LibUnit. I compile. It works. New DCU file is generated for LibUnit.
I go to library's folder and I delete the DPK (and the Dproj) but I keep LibUnit.pas.
I edit LibUnit. I compile. Still works! New DCU file is generated for DCU file is generated for LibUnit.!!!!

問題は、LibUnit のコンパイル方法に関する情報がない (PDK が削除された) 場合、LibUnit はどのようにコンパイルされたのか????? です。明らかに、コンパイラは DPR の設定を使用しました。これは「リリース」モードです。これは、私のライブラリが「リリース」としてプログラムに統合されたことを意味します。.

4

2 に答える 2

5

実行可能ファイルでデバッグ ターゲットとリリース ターゲットを切り替えても、参照されているランタイム パッケージが再構築されることはありません。

パッケージには、それらを使用するプロジェクトから独立した独自のオプションがあります。それが唯一可能なデザインの選択です。たとえば、別の 2 つのプロジェクト A と B で使用されているパッケージがあるとします。現在、A はデバッグ用にビルドされていますが、B はリリース用にビルドされています。同時に両方のパッケージをビルドすることはできません。

「必要に応じて再ビルド」とは、パッケージのソースに関して最新のビルドが古くなっている場合にパッケージが再ビルドされることを意味します。


質問の更新の「実験」に関しては、exeが実行時にパッケージにリンクしていない可能性が最も高いです。代わりに、.pas ファイルが直接コンパイルされ、exe プロジェクトの一部としてリンクされます。

于 2012-08-23T09:19:17.327 に答える
0

この実験は、(上記の条件で) ライブラリに含まれるコードが、DPK の設定ではなく DPR の設定に基づいて EXE にコンパイルされることを示しています。

コンパイラは、PAS ファイルを再コンパイルするときに DPK ファイルを気にしません (DPK が IDE に読み込まれていない場合にのみ適用されます)。**

ここに (すべてのシステムで簡単に再現できる) 証明があります: 私のプログラムを Prog.DPR (Prog.pas を含む) とライブラリ Lib.DPK (LibUnit.pas を含む) と呼びましょう。ライブラリには、TMyPanel ビジュアル コントロールが含まれています。DPR はリリース モードです。DPK はデバッグ モードです。

  • ライブラリをインストールします。ライブラリを終了します (「すべて閉じる」)。
  • DPR を IDE にロードし、LibUnit もロードします (注意: ユニットのみをロードし、DPK はロードしません)
  • プログラムのフォームに TMyPanel を配置しました。
  • LibUnit は、プログラムの USES 句に自動的に追加されます。
  • 私はLibUnitを編集します。コンパイルします。できます。LibUnit 用に新しい DCU ファイルが生成されます。
  • ライブラリのフォルダーに移動し、DPK (および Dproj) を削除しますが、LibUnit.pas は保持します。
  • 私はLibUnitを編集します。コンパイルします。まだ動作します!LibUnit 用に新しい DCU ファイルが生成されます LibUnit 用に DCU ファイルが生成されます。!!!!

問題は、LibUnit のコンパイル方法に関する情報がない (PDK が削除された) 場合、LibUnit はどのようにコンパイルされたのか????? です。明らかに、コンパイラは DPR の設定を使用しました。これは「リリース」モードです。これは、私のライブラリが「リリース」としてプログラムに統合されたことを意味します。.

于 2013-02-08T16:33:01.880 に答える