2011-03-16 114 views
-1

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

我可以确认以下内容:

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

编辑 虽然我经历过这种用Delphi 5,它不是具体到该版本。 Delphi Bug List至少在D4-D6中证实了这个问题。

+0

什么版本的Windows,什么样的sp级别,以及你有什么A/V软件?禁用A/V不是ev如果要用一些品牌的A/V软件来修复它,那么在我不相信它没有破坏你的应用程序之前,它们将不得不被彻底删除。 – 2011-03-16 12:19:46

回答

2

经过漫长的调查,我已经明确了这个问题。

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

您可以测试与下面的简单项目的bug:

program TestDCC32ObjExportAll; 

{$OBJEXPORTALL ON} 

begin 
end; 
  • 随着指令,dcc32不创建EXE。
  • 没有指令,dcc32 确实创建EXE。
  • IDE始终创建EXE。

幸运的是,我们根本不使用BCB,所以我只是简单地禁用指令发生的任何地方。


编辑
美妙的资源The Delphi Bug List报告,这个问题被证实在德尔福4,5存在,和6遗憾的是,德尔福错误清单后停产。 :(

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错误?

+0

+1,但它不是dcc32中的错误。自从v1发布以来,我在Delphi的每个版本中都使用过命令行编译器,并且从来没有遇到过这个问题。这个糟糕的错误会在很久以前被报道。这是某种配置问题(在.cfg文件或命令行选项中),ProcMon应该帮助弄清楚发生了什么。 – 2011-03-16 11:26:59

+0

+1非常有用的信息,虽然它并没有真正告诉我任何新东西。它只是证实了我在任何情况下所怀疑的--dcc32甚至没有尝试写入EXE文件。 – 2011-03-19 13:57:16

+0

@Ken:现在小心,这种想法是导致很多人在错误的兔子洞里浪费时间的原因,因为错误的逻辑忽略了错误的洞。 ;)我确实表示其他项目的构建正确,因此dcc32中的错误确实需要满足一些其他特殊条件。 (查看我的回答) – 2011-03-19 14:00:08

1

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

在构建解决问题之前删除.DCU文件。此外,反病毒软件可以为您的系统做出与时间有关的非常糟糕的事情;在那里做到了这一点:由于这个原因,我的大多数开发系统都在没有防病毒的虚拟机中。

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

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

1

我认为这可能是一个非常已知的问题(对于那些,谁与D5的作品)。

例如,包含的FinalBuilder“德尔福5编译器错误使用。解决方法”中的“构建Delphi工程”行动,它使用不同的选项创建项目两次 - 专门用于创建exe,当dcc32没有创建一个(根据帮助文件)。

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

+0

感谢您的贡献。是的,一种解决方法是构建(生成所有DCU)然后编译。但是,德尔福错误列表确实报告该问题在D4-D6中得到确认。我更新了我的答案以表明这一点。 – 2011-04-25 12:52:11