为什么编译器将不属于当前包的DCU放在其单元输出目录中?

时间:2017-04-05 17:35:01

标签: delphi build packages delphi-10.1-berlin

我创建了两个包P1.dprojP2.dproj

我在包中放了两个空单位,因此P1包含Unit1.pasP2包含Unit2.pas

我将单位输出目录编辑到相应包中的.\P1\$(Platform)\$(Config).\P2\$(Platform)\$(Config)

我添加了P1作为P2项目的参考,因此P2取决于P1。

项目文件存储在同一文件夹中。

目录结构如下所示:

  Root\
    Source\
      P1\
        Unit1.pas
      P2\
        Unit2.pas
    Packages\
      P1.dpk
      P1.dproj
      P2.dpk
      P2.dproj
      P1\
        Win32\
          Debug\
      P2\
        Win32\
          Debug\

在我添加依赖关系P1之前输出Packages\P1\Win32\Debug\Unit1.dcu而P2正在输出Packages\P21\Win32\Debug\Unit2.dcu

没什么意外的。

在我刚构建P2时添加依赖项后,IDE也自动编译P1,但Unit1.dcu文件现在输出到Packages\P2\Win32\Debug\Unit1.dcu

为什么?

Unit1.dcu文件不在Contains P2.droj列表中,也不在任何库路径或浏览路径中列出(Delphi全局或项目本地)。

为什么编译器将东西放入当前项目的单元输出目录中,它甚至无法访问源目录?

当我将P1 dpk / dproj文件移到某个子文件夹并重新启动IDE时,它会正确地抱怨它无法找到P1.dcp文件并且无法从P1开始编译任何内容。

我在一个更大,更复杂的设置中注意到了这种行为,这让我发疯了......

1 个答案:

答案 0 :(得分:1)

这样做是因为两个软件包的源文件都位于同一目录中,并且 P1在其项目选项中设置为“根据需要重建”。

考虑一个包含并使用单元U1的简单项目Proj1。 U1使用Pro2中包含的的U2。编译器必须能够看到U2.dcu;可能在当前的Library路径或其他一些常见的“lib”目录中。编译Proj1时,U1.dcu会进入Proj1的单元输出目录,但U2.dcu只是从当前所在的位置“使用”,不会出现在Proj1的单元输出目录中。

现在,假设您将U2.pas存在的目录添加到Proj1的搜索路径中。现在编译器可以看到U2.pas,所以它编译它并将生成的U2.dcu与U1.dcu放在Proj1的单元输出目录中

这里也是一样的...... P2“需要”P1。也就是说,在编译P2时,编译器需要查看P1.DCP或P1的所有源文件(在这种情况下为P1.dpk和unit1.pas)。

在你的情况下,它可以看到P1.dpk,因为它在同一个目录中,所以它编译它并将得到的dcu(在这种情况下为unit1.dcu)放入P2的单元输出目录。

您可以通过在项目选项中将 P1 设置为“Explicit Rebuild”来阻止此行为。当构建P2或任何“需要”P1的包时,这告诉编译器“即使你可以看到P1的源,也不要构建它。”

相关问题