ビルド時、コンパイル時?
コンパイラは、.pas ソース ファイルの日時スタンプが変更された場合 (1,2) にのみ、ユニットを自動的に再コンパイルします。
プロジェクトのその他の状態変更 (ディレクティブ、デバッグ、その他のコンパイラ設定など) では、コンパイラは自動的に再コンパイルしません。そのときは、ビルドを強制する必要があります。
また、日時スタンプがチェックされていないため、.inc またはその他の含まれている ($I) ファイルが変更された場合にも、強制的に再構築する必要があります(3)。
要約すると、ユニットの .pas ファイル以外が変更された場合は、ビルドを行う必要があります。
建物にはいくつかの奇妙なケースがあります。ほとんどの場合、そこにあるように見えても「ユニット xxx が見つかりません」というエラーが発生します。
- 1 つは、プロジェクト内のユニットのパスが間違っている場合、または作業ディレクトリが間違っているときに相対パスを使用している場合です。(Delphi debug a wrong unitを参照)
- (これについては完全にはわかりません。これは仮説です) CRC (1) のために .dcu が再コンパイルされますが、新しくコンパイルされた dcu は別のディレクトリに配置されます。現在のコンパイルでは (正しい dcu が既にロードされているため) これは問題ではありませんが、後続のコンパイル (依存パッケージなど) で古い dcu ファイルが再び検出され、ソースが not -> エラーになります。 疑わしい場合は、すべての DCU を再帰的に削除して、常にビルド ディレクトリをクリーンアップしてください。
- ユニットは、.dpr で間違ったパスで言及されています
(1) Delphi が FPC のようなものである場合、.dcu には、依存するすべての dcu のインターフェイス セクションの CRC が含まれます。これは、再コンパイルが必要かどうかを確認するためにも使用できます。たとえば、ファイルシステムの操作 (dcu の移動) が原因である
(2) 専門家の方は {$implicitbuild xx} もご覧ください
(3) Delphi とは異なり、FPC は .inc の変更時に再構築します。FPC プロジェクトは内部で .inc ファイルを頻繁に使用します。この変更は、Delphi のサポートが開始される前から行われています。その結果、"defines" inc ファイルを任意のディレクトリにコピーするパッケージは、通常、サイズと CRC がわずかに異なるため、FPC でコンパイルされません。Indy (10) はこの良い例です。