Компилятор командной строки DCC32 завершается успешно, но не создает файл EXE - PullRequest
0 голосов
/ 16 марта 2011

Я использую компилятор командной строки Delphi 5 для сборки. Сборка не сообщает об ошибках, однако не генерирует и файл EXE.

Я могу подтвердить следующее:

  • Выполнение той же сборки через IDE ведет себя правильно.
  • Нет разницы в исходном коде или параметрах между IDE и сборкой DCC32.
  • Проблема возникает только при полной сборке. То есть выполняя сборку сначала с опцией -B, а затем без, компиляция правильно генерирует EXE-файл.
  • Использование параметра -E в командной строке для принудительного задания неверного пути вывода сборки не приводит к ошибке - как будто даже не предпринимается попытка сгенерировать файл EXE.
  • Другие проекты работают правильно.
  • Я отключил антивирусное программное обеспечение и могу подтвердить, что это не проблема.

EDIT Хотя я испытал это с Delphi 5, это не относится к этой версии. Delphi Bug List подтвердил проблему как минимум в D4-D6.

Ответы [ 4 ]

5 голосов
/ 16 марта 2011

Вы можете использовать ProcessMonitor от SysInternale / Microsoft для расследования создания .exe. Запустите procmon.exe и добавьте фильтр с «Путь», «содержит» (имя вашего exe-файла), затем «включите».

В моем окружении компиляция t.pas дала:

    12:09:58,1927245    DCC32.EXE   3596    CreateFile  C:\tmp\t.exe    SUCCESS Desired Access: Generic Write, Read Attributes, Disposition: OverwriteIf, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: None, AllocationSize: 0, OpenResult: Overwritten
    12:09:58,1928116    DCC32.EXE   3596    CreateFile  C:\tmp\t.exe    SUCCESS Desired Access: Read Attributes, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Complete If Oplocked, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
    12:09:58,1928281    DCC32.EXE   3596    QueryFileInternalInformationFile    C:\tmp\t.exe    SUCCESS IndexNumber: 0x46b00000000c296
    12:09:58,1928376    DCC32.EXE   3596    CloseFile   C:\tmp\t.exe    SUCCESS 
    12:09:58,1961352    DCC32.EXE   3596    WriteFile   C:\tmp\t.exe    SUCCESS Offset: 0, Length: 19 968
    ....

Может быть, это ошибка в dcc32?

2 голосов
/ 19 марта 2011

После долгого расследования мне удалось точно определить проблему.

  • Я написал небольшой командный файл, чтобы выполнить сборку и проверить наличие EXE и сообщить об успехе или неудаче в любом случае.
  • Затем я прошел кропотливый процесс устранения зависимостей по одной и перепроверил сборку.
  • В конце концов я отследил ее до определенной директивы компилятора {$ObjExportAll ON}, которая использовалась в некоторых наших третьихпартийные пакеты.
  • Поиск в Интернете показал, что эта ошибка появилась, когда был добавлен $ ObjExportAll для поддержки BCB.Хотя, кажется, с ним редко сталкивались - только моя удача: (
  • Я не уверен, была ли ошибка исправлена ​​или в какой версии.

Вы можете проверить ошибку с помощью следующегопростой проект:

program TestDCC32ObjExportAll;

{$OBJEXPORTALL ON}

begin
end;
  • С директивой dcc32 не создает EXE.
  • Без директивы dcc32 создает EXE.
  • IDE всегда создает EXE.

К счастью, мы вообще не используем BCB, поэтому я просто отключил директиву, где бы она ни происходила.


EDIT
Замечательный ресурс Список ошибок Delphi сообщает, что проблема подтверждена в Delphi 4, 5 и 6. К сожалению, список ошибок Delphi был прекращен после этого.: (*

1 голос
/ 25 апреля 2011

Я думаю, что это может быть очень известная проблема (для тех, кто работает с D5).

Например, FinalBuilder содержит «Использовать обходной путь для ошибки компилятора Delphi 5» в действии «Построить проект Delphi», при котором проект создается дважды с различными параметрами - в частности, для создания exe, когда dcc32 его не создаетв файл справки).

Для Delphi 4 или Delphi 6 подобной опции не существует, поэтому я предполагаю, что она была введена в Delphi 5 и исправлена ​​в Delphi 6.

1 голос
/ 16 марта 2011

Я помню похожие вещи где-то в эпоху Delphi 5 (может быть, Delphi 4 или Delphi 6) в IDE, когда у нас был какой-то мошеннический файл .dcu (у нас был файл .pas).

Удаление файлов .DCU перед сборкой решило проблему.

Также: антивирусное программное обеспечение может делать очень плохие вещи, связанные с синхронизацией вашей системы; было сделано следующее: большинство моих систем разработки находятся на виртуальной машине без антивируса только по этой причине.

Попробуйте воспроизвести проблему Delphi 5 dcc32 на чистой машине (вам нужны только Windows и компоненты Delphi, не более).

Если это работает, тогда используйте Process Monitor , чтобы увидеть различия между этими машинами, как предложил Михал Никлас.

...