2

いくつかのアプリケーションとDLLの間でコードを共有するユーティリティユニットがあります。現在のプロジェクトタイプ(アプリケーション、パッケージ、またはライブラリ)に基づいて、このユニットの一部を選択的にコンパイルしたいと思います。ユニット内のライブラリまたはパッケージの条件付き定義が見つかりませんでしたSystem。また、Googleは関連するものを見つけられませんでした。では、コンパイラなどの条件付き定義やコンパイラによって設定されるものはありIsLibraryますIsPackageか?ちなみに、私はIsLibrary変数を知っています。

4

2 に答える 2

5

そのような事前定義された条件はなく、そのような条件はあり得ません。これは、コンパイル時に、ユニットが最終的に実行可能ファイル、ライブラリ、またはパッケージのいずれにリンクされるかを知ることができないためです。

実際、同じコンパイル済みユニットを上記のプロジェクトタイプのいずれかまたはすべてにリンクすることができます。実際、RTLをプロジェクトにリンクすると、これを自分で確認できます。Systemプロジェクトの種類に関係なく、同じユニット、同じコンパイル済み.dcuファイルをすべてのプロジェクトにリンクします。

于 2013-02-18T09:58:47.910 に答える
1

私見では、既存の規則のため、そのような条件文は絶対に必要ありません。

アプリケーションまたはライブラリ(このコンパイルの側面でも同じ)またはパッケージのコンパイルは、次のように異なります。

  • アプリケーション/ライブラリは、ユニットから使用済みパーツのみをコンパイルします
  • パッケージは、ユニットのインターフェース部分によって参照されるユニットからすべての部分をコンパイルします

ユニット例

unit foo;

interface

procedure foo1;
procedure foo2;

implementation

procedure foo3; 
begin
  // used by foo2, compile depends on foo2 compilation
end;

procedure foo4;
begin
  // will never be compiled, because is never used
end;

procedure foo1;
begin
  // Package: will always be compiled
  // Application/Library: will be compiled if used 
end;

procedure foo2;
begin
  // Package: will always be compiled
  // Application/Library: will be compiled if used 

  foo3;

end;

end.

exeこれは、パッケージを使用すると、プリコンパイルされたファイルの未使用のコード部分が含まれる可能性があるため、ファイルが大きくなる可能性がある理由でもありdcuます。

于 2013-02-18T11:30:17.957 に答える