错误F2063无法编译已使用的单元(依赖包)

时间:2015-01-22 08:50:56

标签: delphi delphi-xe5 dcc32

我写了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。
  • 为什么编译失败?

关于第一个问题,我毫不知道。

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

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

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

我还检查了dcc32命令行,似乎编译器都知道所有已包含的目录。

我可以添加的其他信息:

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

        package 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.

1 个答案:

答案 0 :(得分:4)

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

我只能给你一般建议来解决给出的信息:

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

    < / LI>
  • 永远不要将.dcu与源文件放在同一个文件夹中;总是设置&#34;单位输出目录&#34;您的包的选项(也在Base构建配置中);我建议将$(BDSCOMMONDIR)\MyPacks\$(Config)\$(Platform)作为您的包的目录;如果你已经在源代码(.pas)文件夹中有.dcu删除它们,那么Delphi版本创建这些.dcu&#39; s无关紧要。

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