В чем отличие сборки C ++ Builder от среды IDE и командной строки? - PullRequest
1 голос
/ 10 августа 2010

У меня другое поведение компилятора при сборке проекта из 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?

1 Ответ

2 голосов
/ 11 августа 2010

Я нашел причину: командная строка для dcc32 пропускает ключ -I, который указывает пути для включаемых файлов.

По какой-то причине bpr2mak не поддерживает эту опцию.К счастью, он позволяет указать альтернативный шаблон для конвертации bpr -> mak.Я отредактировал шаблон по умолчанию и добавил к нему опцию «-I», передал новый шаблон в bpr2mak - и все заработало.

...