找不到.pas文件,但.dcu在那里,这还不够吗?

Gui*_*doG 2 delphi delphi-7

在Delphi 7中,我在'Libray path'下的'Tools/Environment options/Library'中有以下目录:

C:\ggProgramFiles\QR-synopse-pdf-files
Run Code Online (Sandbox Code Playgroud)

在那里我有一些Pas文件和他们的Dcu文件.其中一个文件是QRPDFSynFilt.pas和QRPDFSynFilt.dcu

现在我的问题是,由于pas文件可用,我总是在调试时插入它们,我觉得很烦人.
所以我创建了一个新目录:

C:\ggProgramFiles\QR-synopse-pdf-files\dcu  
Run Code Online (Sandbox Code Playgroud)

并且只复制那里的dcu文件.
然后我改变了"工具/环境选项/库"中的路径以指向这个新目录.
但现在Delphi 7告诉我他找不到

C:\ggProgramFiles\QR-synopse-pdf-files\dcu\QRPDFSynFilt.pas
Run Code Online (Sandbox Code Playgroud)

这是正确的只有dcu在那里.
但我一直认为,当Delphi找到足够的DCU文件时,如果找到DCU则不需要PAS文件.

所以我的问题是Delphi是否需要PAS文件进行编译,或者DCU是否足够,如果后者是真的,可能导致Delphi给我这个错误?

编辑Deltic回答

我可以使用编译器指令{$ debuginfo OFF},但由于这些单元是第3方,我不想编辑它们.如果没有别的办法,我仍然会这样做.

编辑Davids评论: 编译器错误是

[Fatal Error] File not found 'C:\ggProgramFiles\QR-synopse-pdf-files\dcu\QRPDFSynFilt.pas'
Run Code Online (Sandbox Code Playgroud)

Del*_*ics 5

是的,如果你有,dcu那么这应该就够了.您的设置还有其他问题.但是,我不是试图解决这个问题,而是在构建环境中引入并尝试处理复杂性,而是" 修复第一个问题 ".

而不是试图欺骗编译器,只需添加一个你永远不想调试的文件{$debuginfo OFF}的顶部pas:

{$debuginfo OFF}
Run Code Online (Sandbox Code Playgroud)

然后,无论项目中的编译器设置如何,这些单元都不会使用调试信息进行编译,调试器也不会进入它们.要重新启用调试,只需.在将指令{转换为注释后添加到指令:

{.$debuginfo OFF}    // This is now just a comment, not an active directive
Run Code Online (Sandbox Code Playgroud)

语法高亮将使差异清晰(假设你有不同颜色配置的注释和指令等,无论如何,这是一个好主意).

将此指令放在条件编译指令中可能是有意义的,这样您就可以使用条件项启用或禁用这些特定但相关单元的调试:

{$ifdef debugQRPDF}
  {$debuginfo ON}
{$else}
  {$debuginfo OFF}
{$endif}
Run Code Online (Sandbox Code Playgroud)

在顶部具有此功能的任何单元都将启用或禁用调试,而不是通过项目编译器设置,而是通过项目条件.然后,您不必担心尝试从编译器中"隐藏"pas文件,以避免调试它们.

不要忘记在更改项目设置(例如条件指令)时,需要进行完全重建才能在构建中正确反映这些更改.

  • @DavidHeffernan - 如果它们在项目中使用,并在构建中重新编译(并且由于OP的问题非常明确,构建正在寻找**pas**文件,那么显然它们**在构建中**) ,如果你用*debug编译项目*,你就不能编译"只是那些单位"*没有*debug.并非没有专门针对这些文件的指令.除非你知道更好,并且出于某种原因只是选择不实际解释如何实现它? (2认同)

Dsm*_*Dsm 5

您可能在项目列表中有该文件。这有效地告诉编译器您要编译它。您需要将其从项目中删除,但将引用保留在引用它的每个单元的 uses 子句中。