【问题标题】:.pas file not found but the .dcu is there, is that not enough?.pas 文件未找到,但 .dcu 存在,这还不够吗?
【发布时间】:2017-02-08 05:08:04
【问题描述】:

在 Delphi 7 中,我的“库路径”下的“工具/环境选项/库”中有以下目录:

C:\ggProgramFiles\QR-synopse-pdf-files

在那里我有一些 Pas 文件和他们的 Dcu 文件。 这里的文件之一是 QRPDFSynFilt.pas 和 QRPDFSynFilt.dcu

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

C:\ggProgramFiles\QR-synopse-pdf-files\dcu  

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

C:\ggProgramFiles\QR-synopse-pdf-files\dcu\QRPDFSynFilt.pas

这是正确的,只有 dcu 在那里。
但是我一直相信,当Delphi找到DCU文件就足够了,如果找到了DCU,就不需要PAS文件了。

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

编辑 Deltics 答案

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

编辑戴维斯评论: 编译器错误是

[Fatal Error] File not found 'C:\ggProgramFiles\QR-synopse-pdf-files\dcu\QRPDFSynFilt.pas'

【问题讨论】:

  • 只需将文件编译为 dcus,并在您的计算机选项中禁用调试。然后提供 dcus 而不是 pas 文件。如果那是你想要的。我不会这样做,但这是你的选择。
  • 我看不到任何错误描述。您只需要从视线中删除 pas 文件。
  • @DavidHeffernan 我用当我停止编译器查看 pas 文件时从 delphi 得到的确切错误更新了问题
  • 我猜它看不到 dcus
  • 但是他们在那里我检查并仔细检查了

标签: delphi delphi-7


【解决方案1】:

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

【讨论】:

  • 我确定我检查了这个,但再次检查它是个好主意。当我回到办公室时,我会这样做
【解决方案2】:

如果它是第三方组件库并且供应商提供了源代码,您可以打开设计时包并在关闭调试信息的情况下重新编译它。这将创建新的 dcus,调试器不会尝试将其调试到关联的 .pas 文件中。 您将在“项目选项”下找到此设置。转到 Delphi 编译器 -> 编译 -> 调试 -> 调试信息。将设置更改为关闭。

【讨论】:

  • 是的,我知道,但它仍然不能解释为什么我在隐藏 pas 文件并只让它看到 dcu 文件时无法编译
  • 仅将 dcu 文件放在另一个目录中是不够的。必须先关闭调试信息重新编译。如果 dcu 编译的 pas 文件引用了另一个目录中没有 dcus 的.pas 文件,那么您需要在编译时提供 .pas 文件。
  • @GuidoG,是的,这可以解释,因为如果您不使用与您的 Delphi 版本相关的 .dcu,就好像它们不存在一样。 -> 我在这里报告了这个非常误导性的编译器错误 -> quality.embarcadero.com/browse/RSP-26359
【解决方案3】:

是的,如果你有dcu 那么这就足够了。您的设置中还有其他问题。但是,与其尝试解决这个问题,并在构建环境中引入和尝试处理复杂性,我会改为“修复第一个问题”。

不要试图欺骗编译器,只需在您不想调试的任何 pas 文件的顶部添加一个 {$debuginfo OFF}

{$debuginfo OFF}

那么无论项目中的编译器设置如何,这些单元将永远不会使用调试信息进行编译,并且调试器也不会进入它们。要重新启用调试,您只需在 { 之后的指令中添加 . 即可将其转换为注释:

{.$debuginfo OFF}    // This is now just a comment, not an active directive

语法高亮将使区别变得清晰(假设您将 cmets 和指令配置为不同的颜色等,无论如何,恕我直言这是个好主意)。

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

{$ifdef debugQRPDF}
  {$debuginfo ON}
{$else}
  {$debuginfo OFF}
{$endif}

任何在顶部带有此项的单元都将启用或禁用调试,而不是由项目编译器设置而是由项目条件。然后,您不必担心试图从编译器中“隐藏”pas 文件以避免调试它们。

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

【讨论】:

  • 我同意肯定有其他问题。我知道编译器指令,但因为它们是第 3 方,我不想编辑 pas 文件,但也许这是我唯一的选择。我将使用此信息更新我的问题
  • 您不需要更改Pascal文件,您只需要编译而无需调试
  • @DavidHeffernan - 但是 OP 无法调试任何东西,包括他们希望调试的代码。关闭特定文件中的调试(独立于适用于所有内容的项目设置)的唯一方法是在这些特定文件中引入指令(或在公共 include 文件中,如果只有那些文件共有的话)你不想调试)
  • @DavidHeffernan - 如果它们在项目中使用,并在构建中重新编译(并且由于 OP 的问题很清楚,构建正在寻找 pas 文件然后显然它们在构建中),那么如果您正在编译项目带有调试,则不能编译“仅那些单元”没有调试。并非没有专门在这些文件中的指令。除非您知道得更好,并且出于某种原因只是选择不实际解释如何实现它?
  • 如果 asker 提供 dcus 但不提供 pas 文件,那么它将完全按照我的描述工作。所以asker需要停止编译器查看pas文件。
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 2020-08-17
  • 2012-10-23
相关资源
最近更新 更多