-1

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

我可以确认以下内容:

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

编辑虽然我在 Delphi 5 中体验过这一点,但它并不特定于该版本。Delphi Bug List至少在 D4-D6 中确认了该问题。

4

4 回答 4

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

于 2011-03-16T11:15:25.727 回答
2

经过长时间的调查,我已经设法查明了问题所在。

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

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

program TestDCC32ObjExportAll;

{$OBJEXPORTALL ON}

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

幸运的是,我们根本不使用 BCB,所以我只是简单地禁用了该指令,无论它发生在哪里。


编辑
精彩资源The Delphi Bug List报告该问题已被确认存在于 Delphi 4、5 和 6 中。不幸的是,Delphi Bug List 在那之后就停止了。:(

于 2011-03-19T14:16:39.067 回答
1

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

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

另外:防病毒软件会对您的系统造成非常糟糕的与时间相关的事情;这样做过:仅出于这个原因,我的大多数开发系统都位于没有防病毒软件的虚拟机中。

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

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

于 2011-03-16T12:44:04.720 回答
1

我认为这可能是一个非常知名的问题(对于那些使用 D5 的人)。

例如,FinalBuilder 在“构建 Delphi 项目”操作中包含“使用 Delphi 5 编译器错误的解决方法”,它使用不同的选项构建项目两次 - 特别是创建 exe,而 dcc32 没有创建一个(根据帮助文件)。

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

于 2011-04-25T12:02:24.703 回答