Delphi 如何制作第三方组件&x27;s DCU文件,不在我的应用程序目录中生成?

Delphi 如何制作第三方组件&x27;s DCU文件,不在我的应用程序目录中生成?,delphi,delphi-xe2,Delphi,Delphi Xe2,在我的Delphi中,每当我重新构建我的应用程序时,所有第三方组件的DCU文件都会在我的应用程序目录中生成,可执行文件就位于该目录中。 如何改变这种行为? 这样第三方组件的DCU文件就不会在我的应用程序目录中生成。编译器生成的.DCU文件都是在同一目录中创建的。因此,无法将生成的.dcu文件放入不同的目录中,并将第三方库中的文件与源文件中的文件分开 但是,将.dcu文件与源文件放在同一目录中通常是一个坏主意。那只会把事情搞得一团糟。最佳做法是将.dcu文件放入项目的子目录中。编译器选项允许您执行

在我的Delphi中,每当我重新构建我的应用程序时,所有第三方组件的DCU文件都会在我的应用程序目录中生成,可执行文件就位于该目录中。
如何改变这种行为?

这样第三方组件的DCU文件就不会在我的应用程序目录中生成。

编译器生成的.DCU文件都是在同一目录中创建的。因此,无法将生成的.dcu文件放入不同的目录中,并将第三方库中的文件与源文件中的文件分开

但是,将.dcu文件与源文件放在同一目录中通常是一个坏主意。那只会把事情搞得一团糟。最佳做法是将.dcu文件放入项目的子目录中。编译器选项允许您执行此操作。打开“编译器选项”对话框,将“目标”下拉列表更改为“所有配置-所有平台”。这是其他配置继承自的基本配置。该对话框如下所示:

您需要更改的设置是单元输出目录。上图显示了XE2上新项目的默认设置。值
\$(平台)\$(配置)
由编译器展开。因此,如果您正在构建针对Win32平台的调试配置,则.dcu文件将输出到
\Win32\debug

编译器选项记录在此处:

机组输出目录的说明如下:

指定包含
.dcu
的单独目录

另一个密切相关的选项是输出目录。这是编译后的可执行文件的放置位置。如果您的目标是多个平台,那么您确实需要将此可执行文件放在主项目目录之外的其他位置。否则,自动化构建将变得困难且容易出错。当您实际上想要一个64位可执行文件时,选择一个过时的32位可执行文件太容易了


因此,我建议您使用默认值
\$(平台)\$(配置)
,因为这是一个非常好的默认值。

我通常在源代码存储库中创建一个COMP\文件夹,我将在此处显示为文件夹树:

    root
      |
      comp\
      | |
      | |--  TMS\   - TMS component set
      | |
      | |--  JEDI\  - Jedi VCL and JCL
      | |
      | |--  Something\ - Your other favorite component
      |
      app\    - My application source code.
在comp\文件夹下,我创建以下其他DCU文件夹:

    comp\
      |
      LIB\
        |
        DXE4\
所有我的组件包(.dpk+.dproj)都被修改为生成并输出到
comp\LIB\
xxx文件夹中,其中xxx是一个简短的代码,表示特定的delphi版本

然后从我的delphi
root\App\MyApp1
文件夹中,我有一个App\DCU\DXE4文件夹,这是我的主应用程序项目
App.dproj
的DCU文件所在的位置。
App.Dproj
Project搜索路径
将已编译的DCU、DFM和RES文件拉入comp\LIB\DXE4中。这意味着App\projects不会从其源代码文件重建my组件。这加快了编译速度

正如David指出的,每个项目只有一个指定的DCU
OUTPUT
文件夹。因此,在我的应用程序(.dpr+.dproj)编译阶段,作为我的component.dpk包编译的DCU输出文件夹的文件夹将成为库输入文件夹

因为我需要在COMP\LIB\DXE4文件夹中同时使用.dfm、.res和.dcu文件,所以我有一个批处理文件(buildcomp.cmd),用于执行所有生成,以及使LIB\DXE4文件夹包含其必须包含的所有内容所需的副本。我不检查库的内容。。。将文件夹放入我的版本控制系统。它们是我的组件构建阶段的二进制和输出产品。对于较大的应用程序和较大的组件集,将组件构建阶段和应用程序构建完全分开是一种更具可伸缩性的方法


我选择将BPL和DCP文件保留在其默认位置(在
%(bdscommodir)\BPL
下),但有些人选择将其BPL和DCP文件重定向到其
COMP\LIB\DXE4
等效文件夹中。Delphi开发人员之间没有统一的标准行为,每个开发人员或公司似乎都在为他们做适合他们的事情。bog标准德尔福实践是完全忽略这些实践,并尽可能无组织,因此,事实上,你甚至已经开始问这样一个问题,这说明了一个值得称赞的趋势,你必须注意到,存在一些混乱,你可能希望强加某种结构,如果这对您或您的公司有利。

您可以通过Project/Options/Delphi Compiler/Unit output Director为所有DCU定义输出目录。我不太确定Bummi或David是否完全回答了您的问题。据我所知,您希望将第三方组件DCU放在一个文件夹中,将您的DCU放在另一个文件夹中。我认为有一种方法可以手动将第三方DCU复制到第二个文件夹,然后让编译器先搜索该文件夹。(您可能必须从编译器中隐藏第三方DCU源文件夹(使用选项),以便在构建时不会重新创建它们。)如果您需要,我想我会提到这一点,以便知道详细信息的其他人可以发布它们。在我看来,这一领域的实践在不同的公司和开发人员之间差异很大。当然,您会使用运行时软件包,或者将文件包含在您的项目中。但听起来你们两个都在做。为什么?有些人可能会选择使用运行时包,在这种情况下,他们的分段应用程序中可能会出现DLL地狱。请记住,Delphi缺少真正的“library”(.LIB)文件格式,因此一个充满“LIB\DCUXE4*.dcu”文件的文件夹是最接近库样式工作流的文件夹(在该文件夹中,应用程序每次重建时都不会重新编译组件代码)。如果您希望同时重新编译所有组件代码和应用程序代码,在小型Delphi应用程序中,您可以。然而,你的应用程序越大,你的愿望就越少