У меня есть другое поведение компилятора, когда строительный проект от IDE и от командной строки, которую я не могу объяснить.
Описание подробной проблемы является довольно большим, но это действительно просто.
У меня есть Разработчик C++ проект, который имеет включенный (IncludeUnits.pas) файла ПЕРВЕНСТВА. Этот файл первенства имеет несколько единиц и перечисленных inc-файлов. Эти файлы расположены в отдельных папках, и эти папки перечислены в путях library&include в опциях проекта.
Расположение папок:
C:\Demo\Bin
C:\Demo\Project
C:\Demo\Project\CBuilder5
C:\Demo\Project\Common
C:\Demo\Source
C:\Demo\Source\Common
Мусорное ведро является выходной папкой, Project/CBuilder5 содержит проект (bpr-файл), хранения Проекта/Распространенные включали файл первенства (IncludeUnits.pas), Источник и Источник / Общее хранение другие файлы (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++ IDE то - он скомпилирует прекрасный. Разработчик C++ 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.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..\include; 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. ПЕРВЕНСТВО
Borland Delphi Version 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) Фатальный: Файл, не найденный: 'Test.inc'
Как Вы видите - весь путь поиска передается компилятору, и файл (Test.inc) является всем здесь - в той папке Source\Common. Но все еще компилятор не может найти его?
Конечно, я выполняю обе команды от папки с bpr-файлом. И изменение путей к абсолюту не помогает.
Копирование Test.inc от Source\Common до Источника поможет. При изменении {$I Test.inc} к {$I Common\Test.inc} также поможет.
Почему? Кажется, что я пропускаю что-то.Помните: проект не имеет никаких проблем с компиляцией от IDE, Test.inc найден, не копируя или изменяя объявление. Я пропускал некоторый переключатель для создания или dcc32?
Я нашел причину: в командной строке для dcc32 отсутствует переключатель -I, который указывает пути для включаемых файлов.
По какой-то причине bpr2mak не поддерживает эту опцию. К счастью, он позволяет указать альтернативный шаблон для преобразования bpr -> mak. Я отредактировал шаблон по умолчанию и добавил к нему параметр «-I», передал новый шаблон в bpr2mak - и он сработал.