dcc 命令行编译器的 -i 和 -u 参数有什么区别?

What is the difference between the -i and -u parameters to the dcc command-line compilers?

Delphi dcc 命令行编译器(dcc32.exe、dcc64.exe、dcclinux64.exe 等)的 -i 选项究竟是什么?相对于 -u?帮助只是简要说明了这一点(而且 Embarcadero 文档似乎没有对这个主题进行扩展):

    -I<paths> = Include directories
    -U<paths> = Unit directories

有一段时间,我认为 -u 是为了包含源代码而 -i 是为了包含预编译的 .dcu 文件,但似乎并非如此。我还看到 -i 导入源代码和 -u 导入 .dcu 文件的情况,而且这似乎工作得很好。另一种想法是 -u 是 Delphi IDE 中项目搜索路径的对应物,而 -i 是 Delphi IDE 的全局搜索路径的对应物库路径,但这似乎也不是决定性的。

我应该什么时候使用其中之一,-i 或 -u?

此页面的备注部分 http://docwiki.embarcadero.com/RADStudio/Sydney/en/Include_file_(Delphi) 开始

The $I parameter directive instructs the compiler to include the named file in the compilation. In effect, the file is inserted in the compiled text right after the {$I filename} directive.

The default extension for filename is .pas. A filename specified with no file extension always gets the .pas extension. If the filename does not specify a directory path, then, in addition to searching for the file in the same directory as the current module, Delphi searches in the directories specified in the Search path input box on the Delphi Compiler page of the Project > Options dialog box (or in the directories specified in a -I option on the command line compiler). ..."

要理解的重要一点是,这不是谈论一般搜索源文件,而是搜索源文件中由[=20=命名的单个文件]

{$inc }

{$include }

源文件中的指令。例如

unit SomeUnit;

{$inc SomeIncludeFile}

interface

[...]

在 {$inc} 或 {$include} 指令中命名的文件被称为“包含文件” - 因此引用页面的标题主题。根据 Remarks 最后一段中指出的限制,该指令几乎可以出现在源文件中的任何位置,并且在编译期间,编译器会用命名文件的内容替换指令(包括文件名)。在 Turbo Pascal pre-dates 中对 include files 的支持及其对单位的支持主要是为了确保两个或多个源文件可以表现得好像它们包含相同的文本,例如共享代码或定义。

-i 设置告诉编译器一个或多个文件夹,在其中查找文件,例如 SomeIncludeFile,这些文件由编译器在编译源文件时遇到的 include 指令命名在一个项目中。

-u 设置告诉编译器在编译期间在哪里查找单元文件(例如 .Pas 和 .Dcu 文件)。