У меня другое поведение компилятора при сборке проекта из IDE и из командной строки, что я не могу объяснить.
Подробное описание проблемы довольно большое, но очень простое.
У меня есть проект C ++ Builder, в который включен PAS-файл (IncludeUnits.pas). Этот pas-файл содержит несколько модулей и inc-файлов. Эти файлы расположены в отдельных папках, и эти папки перечислены в библиотеке и включают пути в настройках проекта.
Расположение папок:
C: \ Demo \ Bin
C: \ Demo \ Project
C: \ Demo \ Project \ CBuilder5
C: \ Demo \ Project \ Common
C: \ Demo \ Source
C: \ Demo \ Source \ Common
Корзина - это выходная папка, Project / CBuilder5 содержит проект (bpr-файл), Project / Common хранит включенный pas-файл (IncludeUnits.pas), Source и Source / Common хранят другие файлы (pas & inc). Я думаю, что это довольно обычный макет.
C: \ Demo \ Project \ Common \ IncludeUnits.pas :
unit IncludeUnits;
interface
uses
Test;
implementation
end.
C: \ Demo \ Source \ Test.pas :
unit Test;
interface
{$I Test.inc}
implementation
end.
C: \ Demo \ Source \ Common \ Test.inc :
// this file is empty
Если я скомпилирую этот проект из C ++ Builder IDE - он скомпилируется нормально. В C ++ Builder IDE нет дополнительных путей в настройках IDE.
Теперь я хочу скомпилировать его из командной строки. Сначала я выдаю
bpr2mak.exe MyProject.bpr
команда.
Эта команда создает файл MyProject.mak, где я вижу все пути (".... \ Source" и ".... \ Source \ Common" - это рассматриваемые пути):
...
INCLUDEPATH = $ (BCB) \ include; $ (BCB) \ include \ vcl; .. \ Common; .. \ .. \ Source; .. \ .. \ Source \ Common
LIBPATH = $ (BCB) \ lib \ obj; $ (BCB) \ lib; .. \ Common; .. \ .. \ Source; .. \ .. \ Source \ Common
...
Теперь я запускаю команду make:
make.exe -B -f "MyProject.mak"
Это дает мне следующий вывод:
C: \ PROGRA ~ 1 \ Borland \ CBUILD ~ 2 \ BIN \ dcc32 -N2 .... \ Bin -N0 .... \ Bin - $ Y + - $ W - $ R -v -JPHNE -M -uc: \ PROGRA ~ 1 \ Borland \ CBUILD ~ 2 \ Bin .. \ включают в себя: C: \ PROGRA ~ 1 \ Borland \ CBUILD ~ 2 \ Bin .. \ Include \ VCL; .. \ Common; .. \. . \ Source; .. \ .. \ Source \ Common -D_DEBUG; _RTLDLL; NO_STRICT -OC: \ PROGRA ~ 1 \ Borland \ CBUILD ~ 2 \ bin .. \ include; C: \ PROGRA ~ 1 \ Borland \ CBUILD ~ 2 \ bin .. \ include \ vcl; .. \ Common; .. \ .. \ Source; .. \ .. \ Source \ Common --BCB .. \ Common \ IncludeUnits.PAS
Borland Delphi Версия 13.0 Copyright (c) 1983,99 Inprise Corporation
C: \ Demo \ Project \ Common \ IncludeUnits.pas (1) C: \ Demo \ Project \ Common \ IncludeUnits.pas (1) C: \ Demo \ Project \ Common \ IncludeUnits.pas (1) C: \ Demo \ Project \ Common \ IncludeUnits.pas (6) C: \ Demo \ Source \ Test.pas (1) C: \ Demo \ Source \ Test.pas (5) Fatal: файл не найден: 'Test.inc'
Как видите, весь путь поиска передается компилятору, а файл (Test.inc) находится здесь - в этой папке Source \ Common. Но все же компилятор не может его найти?
Конечно, я запускаю обе команды из папки с bpr-файлом. И изменение пути к абсолюту не помогает.
Копирование Test.inc из Source \ Common в Source поможет. Изменение {$ I Test.inc} на {$ I Common \ Test.inc} также поможет.
Почему? Кажется, я что-то упустил. Помните: у проекта нет проблем с компиляцией из IDE, Test.inc находится без копирования или изменения объявления. Я пропустил какой-то переключатель для make или dcc32?