Delphi XE2 后台 IDE 编译器无法找到源路径。

11
我刚刚购买了XE2版本,安装了更新1 ISO,并让我的开源项目与其一起编译。
事实上:
  • 我将库的源代码路径添加到了IDE的常规设置中(对我现在使用的所有平台都适用,即32位和64位的Windows);
  • 我编译了我们框架的TestSQLite3.dpr回归测试——没有问题:EXE已编译,所有测试都通过了;
  • 我在IDE背景编译器方面遇到了一些奇怪的问题:即使项目已经编译,IDE仍会显示一些关于未知文件的错误(不是在底部的编译器消息中,而是在类导航树的顶部——在源代码编辑器的左侧),并且在.dpr源代码中,单元名称会被红色下划线标出,我无法使用Ctrl+单击符号进行导航。

我已经将库的源代码路径添加到了项目选项中(针对Win32/Win64——即使全局IDE级别已经设置)。现在关于未知文件的错误已经消失了,但是源代码中的单元名称仍然被红色下划线标出,并且Ctrl+单击也无法工作。

TestSQLite3.dpr源代码没有指定单元的完整路径:

uses
  {$I SynDprUses.inc}
  Windows,
  Messages,
  SysUtils,
  Classes,
  SynCrypto,
  SynCrtSock,
  SynCommons,
  SynDB,
  SynOleDB,
  SynDBOracle,
  (...)

在上述行中,SynCrypto、SynCrtSock和SynCommons以红色下划线显示。
我的实际猜测是在.dpr文件中需要使用完整路径(SynCrypto in '..\SynCrypto.pas')。我没有测试这个问题,因为我在工作中没有XE2。
由于之前的IDE在这种源代码方面没有问题(从Delphi 6到XE都可以工作),我想知道是否存在回归的可能性,或者新版本的IDE中有不可用的选项(可能是基于平台的),我没有正确设置。或者可能现在在.dpr文件中需要完整路径——但这对我来说听起来像是Code/Error Insight编译器的一个回归。

1
安装更新3后-仍然没有改变。我通过清除.dpr中的任何代码并将所有文件放在外部单元中找到了解决方案。请参见http://synopse.info/fossil/info/ddcf953db5 - Arnaud Bouchez
还有一个小故障。我在网上阅读了SAD 1.18 HTML文档,并在4.1节中单击WinAnsiString链接。它将我重定向到404 URL http://synopse.info/files/html/api-1.18%5CSynCommons.html#WINANSISTRING - 注意那里错误的%5C,而不是正确的斜杠单字符。 - Arioch 'The
是的,在线文档似乎已经修复了。但是我是否正确地认为复制批处理是一个全部或无一的大批处理?因为在创建记录版本时,“正在进行中”的批次信息似乎丢失了。而且复制是为缓慢和不可靠的互联网场景而设计的。这让我想起了20年前通过邮件获取文件的情况。Outlook Express通过19200波特拨号连接进行POP3连接,获取几封信,最后找到一封5MB的信。它会在几分钟内拉取它,直到服务器说“超时!”并回滚事务。这就是一切停滞的地方。 - Arioch 'The
我只是担心如果有足够的延迟更改导致全量更新 blob 传输失败,我们就会陷入同样的困境:新的更改将被添加,使 blob 像雪球一样增长。而且我们无法将复制切片到较小的原子,因为我们从记录版本中删除了事务信息。当然,在快速可靠的连接情况下,这不会成为问题,但在这些设置中,复制本来就不需要开始。 - Arioch 'The
@Arioch'The 在复制过程中有一个参数,以便通过块检索数据。巨大的数据库内容将通过多个较小的调用进行检索。然后,可以启用异步实时复制。 - Arnaud Bouchez
显示剩余3条评论
2个回答

12

我向 Dr Bob 提出了这个问题(我从他那里购买了XE2许可证 - 因为1美元=1欧元方程听起来有点不公平,我想至少要有一个真正的Delphi专家作为我的转售商)。

以下是他的答复:

你没有犯错。问题在于XE2中有三个编译器(如之前的Delphi版本):真正的编译器(运行良好)、代码洞察编译器(速度更快)、错误洞察编译器(必须更加快速)以及语法高亮解析器(速度最快)。

XE2引入了许多功能,使得正常编译器变得较慢,并给Code Insight和Error Insight编译器带来了一些麻烦。首先,我们有新的目标:Win32、Win64和OSX,这导致每个目标的搜索路径都不同(请参见$PLATFORM指令),以及构建配置,尽管每个PLATFORM只有一个“库路径”(而不是针对构建配置)。

第二个复杂因素是引入的点分单元名称(作用域单元名称)。Windows不再是Windows,而是Winapi.Windows。

我猜这两个附加的复杂因素会给Code Insight和Error Insight编译器带来问题。请注意,真实的编译器仍然可以工作。但是错误洞察显示不正确的错误,而Code Insight在这些单元上并不总是起作用。

您可以尝试再次将它们显式地添加到项目中(在这种情况下,将使用完整路径,就像您在stackoverflow的问题中提到的那样)。

所以我担心这是一些回归...

在结束问题时编辑:

第一点是添加完整路径:

  SynPdf in '..\SynPdf.pas',

在.dpr文件中,确实让文件被找到了 - 但是后台编译器仍然迷失了方向,在此处无法找到类声明。

这只是另一个回归例子:

   var Thread: array[0..3] of integer; 
       Handle: array[0..high(Thread)] of integer;

这是一种完全安全的语法,可以正常编译,在之前的 Error Insight 编译器中也没有任何问题(自 Delphi 5 起就可用),但在 XE2 中失败了。

我对 XE2 IDE 有点失望。虽然编译器可以工作,但从我的角度来看,IDE 真的很令人失望,无法使用。我将继续使用 Delphi 7 作为我的主要编辑器,并只使用 XE2 作为跨平台编译器和调试器。


我在使用Delphi XE2时遇到了“作用域单位名称”功能的问题。这是我必须应用于我们框架源代码的主要修改:Graphics单元必须在uses子句中标记为VCL.Graphics。好吧,那只是一个条件性的添加问题,但老实说,我在我的代码中写更少的条件语句,越好。有许多第三方项目(不仅是开源的)依赖于支持许多Delphi平台(至少Delphi 7/2007)。这种回归对私人应用程序代码不是问题,但对库来说并不好。 - Arnaud Bouchez
2
我认为这值得作为质量控制条目,你觉得呢? - Arnaud Bouchez
1
我对此感到非常失望。也许使用 FPC 应该已经足够了,而且它已经更好了(因为它支持更多的平台和目标)。 - Arnaud Bouchez
必要的单元作用域名称也可以作为“-NS”参数传递给编译器(如果我没记错,自Delphi 2009以来就存在此选项),以避免在代码中使用条件语句。 - mjn
@mjn 1. 编译器按预期工作,代码中没有条件语句。其他特定于IDE的后台编译器无法编译有效的代码,我认为它们不使用这些参数。即使是项目/选项参数也被这些编译器忽略了。2. 我认为这些问题与单元作用域名称没有任何关联,而是与库路径有关于第一个问题,与错误的编译器有关于第二个问题。也许实现单元作用域名称破坏了那些编译器,但设置单元作用域名称也无济于事。 - Arnaud Bouchez

0

本文讨论了主编译器(在IDE和DCC32.exe中创建EXE的编译器),它与源代码一起工作。问题出现在后台IDE编译器上,似乎不如主Delphi编译器水平高。 - Arnaud Bouchez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接