DCC32命令行编译器成功完成,但不生成EXE文件

时间:2011-03-16 10:58:15

标签: delphi dcc32

我正在使用Delphi 5命令行编译器来进行构建。构建不会报告任何错误,但它也不会生成EXE文件。

我可以确认以下内容:

  • 通过IDE执行相同的构建行为正确。
  • IDE与DCC32版本之间的源代码或选项没有区别。
  • 问题仅在完整版本中发生。即首先使用-B选项进行构建,然后执行一个不使用,'compile'正确生成EXE文件。
  • 使用命令行上的-E开关强制生成无效的构建输出路径不会报告错误 - 就好像甚至没有尝试生成EXE文件一样。
  • 其他项目确实构建正确。
  • 我已禁用防病毒软件,因此可以确认这不是问题。

EDIT 虽然我在Delphi 5中遇到过这种情况,但并不是特定于该版本。 Delphi Bug List至少在D4-D6中确认了这个问题。

4 个答案:

答案 0 :(得分:5)

您可以使用SysInternale / Microsoft的ProcessMonitor来调查.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中的错误?

答案 1 :(得分:2)

经过长时间的调查,我已经找到了解决问题的方法。

  • 我写了一个小批处理文件来进行构建并检查EXE并以任何方式报告成功或失败。
  • 然后我经历了一次消除依赖关系并重新测试构建的艰苦过程。
  • 我最终将其追溯到我们的一些第三方软件包中使用的特定编译器指令{$ObjExportAll ON}
  • 搜索互联网时发现,当为BCB支持添加$ ObjExportAll时引入了此错误。虽然似乎很少遇到 - 只是我的运气:(
  • 我不确定是否修复了错误的版本。

您可以使用以下简单项目测试错误:

program TestDCC32ObjExportAll;

{$OBJEXPORTALL ON}

begin
end;
  • 使用该指令,dcc32不会创建EXE。
  • 如果没有该指令,dcc32 创建EXE。
  • IDE始终创建EXE。

幸运的是我们根本不使用BCB,所以我只是在任何地方都禁用了指令。


EDIT
精彩的资源The Delphi Bug List报告说Delphi 4,5和6中确认存在该问题。遗憾的是,此后Delphi Bug List已经停止。 :(

答案 2 :(得分:1)

当我们有一些流氓.dcu文件(我们确实有一个.pas文件)时,我记得在Delphi 5时代(可能是Delphi 4或Delphi 6)中的某些地方有类似的东西。

在构建解决问题之前删除.DCU文件。

另外:防病毒软件可以为您的系统做与时间相关的非常糟糕的事情;做到了这一点:我的大多数开发系统都是在没有防病毒的虚拟机中出于这个原因。

尝试在干净的机器上重现您的Delphi 5 dcc32问题(只需Windows和您需要的Delphi组件,仅此而已)。

如果可行,请使用Process Monitor查看MichałNiklas建议的那些机器之间的差异。

答案 3 :(得分:1)

我认为这可能是一个非常着名的问题(对于那些与D5合作的人)。

例如,FinalBuilder在“Build Delphi project”操作中包含“使用Delphi 5编译器bug的解决方法”操作,该操作使用不同的选项构建项目两次 - 特别是在dcc32不创建exe时创建exe(根据帮助文件) )。

Delphi 4或Delphi 6没有类似的选项,所以我猜它是在Delphi 5中引入的,并在Delphi 6中得到修复。