永不构建包 [xxx] 必须重新编译/违反共享 [Delphi 文档问题]

Never-build package [xxx] must be recompiled / SHARING VIOLATION [Delphi documentation issue]

我刚刚升级到 Delphi XE7。现在在 XE 中完美兼容的包不再编译了。

我的包 B 需要将 ImplicitBuild 设置为 OFF 的包 A。 首先,我编译并安装了包 A。然后我尝试编译包 B,但编译器说:

[dcc32 Fatal Error] A.dpk(39): E2225 Never-build package 'A' must be recompiled.

[dcc32 Fatal Error] B.dpk(34): E2202 Required package 'A' not found.

显然,因为编译器知道它的内容(它知道 ImplicitBuild 设置为 OFF),所以找到了包 A。 另外,显然,我在 'Library path'.

中添加了包 A 的路径

如果我从包 A 中删除 ImplicitBuild 指令,编译器只会说:

'Required package 'A' not found.'

Process Monitor 显示一个有趣的条目:

C:\Users\trei\Documents\Embarcadero\Studio.0\Imports\A.dcp <-- PATH NOT FOUND

C:\Users\Public\Documents\Embarcadero\Studio.0\Bpl\A.bpl <-- SHARING VIOLATION

'C:\Users\trei\Documents\Embarcadero\Studio\' 中没有“15.0”文件夹。

  1. 为什么找不到 A.dpk 文件?
  2. 为什么Delphi要重新编译A包?
  3. 为什么 Delphi 在 'Imports' 文件夹中搜索 DCP 文件? DCP 存储在 'c:\Users\Public\Documents\Embarcadero\Studio.0\Dcp\A.dcp'

有趣的事实:
有一个与此消息相关的错误(错误#109584),但它在 XE4 中被标记为已修复。 http://qc.embarcadero.com/wc/qcmain.aspx?d=109584
回归?

PATH 环境变量必须包含 bpl 文件夹。安装程序通常会为您添加此文件夹。如果不是这样,那么 Delphi 将找不到 bpl,因为它们是作为 dll 加载的。 LoadLibrary 不关心包输出目录。但是路径变量的大小是有限制的。所以这可以解释为什么在您全新的 Delphi 安装中缺少它。

在 Delphi 的最新版本中,您可以转到工具 -> 选项 -> 环境变量并添加 path 用户覆盖而不是修改 env 路径: C:\Users\Public\Documents\Embarcadero\Studio.0\Bpl;C:\Program Files (x86)\Embarcadero\Studio.0\bin;C:\Program Files (x86)\Embarcadero\Studio.0\bin64;C:\Users\Public\Documents\Embarcadero\Studio.0\Bpl\Win64;C:\Users\Public\Documents\Embarcadero\InterBase\redist\InterBaseXE3\win32_togo;C:\Users\Public\Documents\Embarcadero\InterBase\redist\InterBaseXE3\win64_togo;$(PATH)

末尾的 $(PATH) 用作全局 PATH 环境变量的占位符。

这会减小 PATH 环境变量的大小,特别是如果您安装了多个 Delphi 版本。