В чем разница между параметрами -i и -u для компиляторов командной строки dcc?

Что такое параметр -i компиляторов командной строки Delphi dcc (dcc32.exe, dcc64.exe, dcclinux64.exe и других)? В отличие от -у? В справке это кратко изложено (и документация Embarcadero, похоже, не распространяется на эту тему):

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

Какое-то время я думал, что -u для включения исходного кода, а -i для включения предварительно скомпилированных файлов .dcu, но, похоже, это не так. Я также вижу случаи, когда -i импортирует исходный код, а -u импортирует файлы .dcu, и это тоже работает нормально. Другая мысль состоит в том, что -u должен быть аналогом пути поиска проекта в Delphi IDE, а -i - аналогом глобального пути к библиотеке Delphi IDE, но это тоже не кажется окончательным.

Когда я должен использовать один или другой, -i или -u?


person Matthias B    schedule 21.03.2021    source источник
comment
Параметр -I используется для директивы $INCLUDE docwiki.embarcadero.com/RADStudio/Sydney/ ru/   -  person zed    schedule 21.03.2021
comment
Я думаю, что нет, потому что опция -i для dcc32 принимает в качестве аргумента список путей, а не имя файла. Так что это должно быть что-то еще, я считаю.   -  person Matthias B    schedule 21.03.2021
comment
Да, документация очень четко об этом говорит!   -  person Delphi Coder    schedule 21.03.2021
comment
Не могли бы вы указать на эту документацию? Я тщательно искал и не нашел по нему никакой документации, кроме единственной строки -I‹paths› = Включить каталоги, которые выводит dcc32 -h.   -  person Matthias B    schedule 21.03.2021
comment
Извините, указатель, указанный @zed, уже включает его: если в имени файла не указан путь к каталогу, то, помимо поиска файла в том же каталоге, что и текущий модуль, Delphi выполняет поиск в указанных каталогах. в поле ввода Путь поиска на странице Компилятор Delphi диалогового окна Проект › Параметры (или в каталогах, указанных в параметре -I компилятора командной строки). Итак, действительно, кажется, что это (единственная?) цель опции -i для dcc32. Благодарю вас!   -  person Matthias B    schedule 21.03.2021
comment
-i и -u отвечают на два разных вопроса: где искать включаемые файлы, названные в исходном коде Delphi, и где искать юнит-файлы Delphi (.Pas и .Dcu).   -  person MartynA    schedule 21.03.2021
comment
Если вы не уверены в командной строке DCC, вы можете посмотреть, какую командную строку использует IDE.   -  person fpiette    schedule 21.03.2021
comment
-I‹paths› = каталоги с включенными файлами было бы более полезной формулировкой в ​​тексте справки, который выводит dcc32 -h. Во всяком случае, теперь я вижу, что это такое. Спасибо вам всем!   -  person Matthias B    schedule 21.03.2021


Ответы (1)


Раздел «Примечания» на этой странице http://docwiki.embarcadero.com/RADStudio/Sydney/en/Include_file_(Delphi) начинается

Директива параметра $I указывает компилятору включить указанный файл в компиляцию. По сути, файл вставляется в скомпилированный текст сразу после директивы {$I filename}.

Расширение по умолчанию для имени файла — .pas. Имя файла, указанное без расширения файла, всегда получает расширение .pas. Если в имени файла не указан путь к каталогу, то, помимо поиска файла в том же каталоге, что и текущий модуль, Delphi выполняет поиск в каталогах, указанных в поле ввода Путь поиска на странице компилятора Delphi в Проекте › Параметры диалоговое окно (или в каталогах, указанных в параметре -I компилятора командной строки). ...

Важно понимать, что речь идет не о поиске исходных файлов в целом, а скорее об отдельных файлах, названных в исходном файле пользователем.

{$inc }

or

{$include }

директива в исходном файле. Например

unit SomeUnit;

{$inc SomeIncludeFile}

interface

[...]

Файлы, названные внутри директивы {$inc} или {$include}, называются включаемыми файлами — отсюда и заголовок цитируемой страницы. С учетом ограничения, отмеченного в последнем абзаце Примечаний, директива может появляться практически в любом месте исходного файла, и во время компиляции компилятор заменяет директиву содержимым именованного файла (включая имя файла). Поддержка include files в Turbo Pascal предшествовала поддержке единиц и в первую очередь была предназначена для обеспечения того, чтобы два или более исходных файла могли вести себя так, как если бы они содержали идентичный текст, например, общий код или определения.

Параметр -i указывает компилятору одну или несколько папок, в которых следует искать файлы, такие как SomeIncludeFile, которые названы директивами include, с которыми компилятор сталкивается при компиляции исходных файлов в проекте.

Параметр -u указывает компилятору, где искать юнит-файлы (например, .Pas и .Dcu) во время компиляции.

person MartynA    schedule 21.03.2021
comment
Это хорошее разъяснение - спасибо! Если вы включите в свой ответ (возможно, сначала) также основной факт, что -i указывает каталоги для поиска включаемых файлов (фактический, простой ответ на вопрос, заданный @zed в самом первом комментарии) и, возможно, весь цитата из документации Embarcadero, а затем после этого ваше текущее дополнительное пояснение о разнице между файлами .inc и .pas и .dcu, тогда это будет идеальный ответ, и я сразу же отмечу его как принятый. - person Matthias B; 21.03.2021