2

我写了 2 个包:MEComps_DXE5 和 AMLComps_DXE5。后者取决于前者。两者都应该是多平台的:Win32、Win64 和(将来)OSX。

当我打开第一个包 MEComps_DXE5 时,我能够编译、构建和安装它。我收到一些警告,因为该库包含的代码也必须在旧 D5 上编译,但构建成功并在预期的位置创建 dcu 和 dcp 文件。

当我打开第二个包 AMLComps_DXE5 时,我发现这种情况:

  • 如果我不声明对 MEComps_DXE5 的依赖,包将正确编译和构建(没有错误,会生成 dcu 和 dcp 文件),但 Delphi 会警告我它已从 MEComps_DXE5 隐式导入单元,并要求我添加包到依赖列表(需要)
  • 如果声明了依赖项,则编译将失败"[dcc32 Fatal Error] MEComps_DXE5.dpk(52): F2063 Could not compile used unit 'MEClasses.pas'"其中 MEClasses 是 MEComps_DXE5 包的第一个单元。

这几天我一直在尝试解决这个问题,但无济于事。我在两个方面工作:

  • 为什么 Delphi 甚至试图编译另一个包?我刚刚构建并安装了它,并且拥有所有 dcus 和 dcp。
  • 为什么编译失败?

至于第一个问题,我一点头绪都没有。

至于第二个问题,在这种情况下,文档是无用的。它解释了为什么不能编译使用的单元是致命的,并指出原因是通过查看以前的错误来确定的。但在这种情况下,没有以前的错误。

由于 MEComps_DXE5 实际上是自己编译和构建的,我怀疑这与语法或代码有什么关系。似乎编译器无法找到编译这些单元所需的东西。

这两个包分别位于各自的目录中。我将 MEComps\Win32 dcu 目录放在库路径和浏览路径上。IDE 查找使用的单位实际上没有问题。

我还检查了 dcc32 命令行,编译器似乎知道所有涉及的目录。

我可以添加的其他信息:

  • 两个包都有自己的包含文件(在它们的源目录中)。我不确定这些是否包含在包包含列表中,但我已经尝试了两种方法,似乎没有任何改变。
  • 这两个包都有一个对应的 Delphi 5 包,其中包括一些相同的单元和代码(虽然不同的 dpk)。这些编译和构建正确。Delphi 5 dcu 文件在源目录中生成。这会对 XE5 编译器造成问题吗?
  • 这是 MEComps_DXE5 包的完整代码。我看到 Delphi 在创建空包时插入了很多编译器指令。我没有碰那些:

        包 MEComps_DXE5;

{$R *.res} {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} {$ALIGN 8} {$ASSERTIONS ON} {$BOOLEVAL OFF} {$DEBUGINFO ON} {$EXTENDEDSYNTAX ON} {$IMPORTEDDATA ON} {$IOCHECKS ON} {$LOCALSYMBOLS ON} {$LONGSTRINGS ON} {$OPENSTRINGS ON} {$OPTIMIZATION OFF} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} {$REFERENCEINFO ON} {$SAFEDIVIDE OFF} {$STACKFRAMES ON} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} {$IMAGEBASE $400000} {$DEFINE DEBUG} {$ENDIF IMPLICITBUILDING} {$IMPLICITBUILD ON} requires rtl, fmx, dbrtl, xmlrtl; contains MEClasses in 'MEClasses.pas', MEConsts in 'MEConsts.pas', MEDataReader in 'MEDataReader.pas', MEDateUtils in 'MEDateUtils.pas', MEEncoding in 'MEEncoding.pas', MEEncodingISO2022 in 'MEEncodingISO2022.pas', MEFileUtils in 'MEFileUtils.pas', MELists in 'MELists.pas', MEMath in 'MEMath.pas', MENumUtils in 'MENumUtils.pas', MESQLUtils in 'MESQLUtils.pas', MEStrUtils in 'MEStrUtils.pas', MESysUtils in 'MESysUtils.pas', METypes in 'METypes.pas', MEURIUtils in 'MEURIUtils.pas', MEXMLUtils in 'MEXMLUtils.pas'; end.

4

1 回答 1

5

Delphi IDE 在编辑/编译包方面远非完美,但您应该自己解决问题 - 更好地配置您的包,Delphi 将正确编译它们。

我只能为您提供针对所给信息的一般建议:

  • 如果您需要 2 个包的通用包含文件,请为该文件创建一个单独的目录,并将此目录添加到两个包的搜索路径(在Base构建配置中)。

  • 切勿将 .dcu 与源文件放在同一个文件夹中;始终为您的包设置“单元输出目录”选项(也在Base构建配置中);我建议$(BDSCOMMONDIR)\MyPacks\$(Config)\$(Platform)为您的软件包提供这样的目录;如果您在源 (.pas) 文件夹中已经有 .dcu,请删除它们,不管是哪个 Delphi 版本创建了这些 .dcu。

  • 永远不要将依赖包源的路径添加到搜索路径,只添加到已编译 .dcu 的路径($(BDSCOMMONDIR)\MyPacks\$(Config)\$(Platform)如果您遵循先前的建议)。

于 2015-01-22T09:58:47.253 回答