错误 F2063 无法编译使用的单元(依赖包的)
Error F2063 Could not compile used unit (of dependent package)
我写了 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\Win32dcu目录放在了库路径和浏览路径上。 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 0000}
{$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.
Delphi IDE 在 editing/compiling 包方面远非完美,但你应该解决你这边的问题 - 更好地配置你的包并且 Delphi 会正确编译它们。
我只能针对给定的信息给您一般性建议:
如果您需要 2 个包的公共包含文件,请为该文件创建一个单独的目录,并将此目录添加到两个包的搜索路径中(在 Base
构建配置中)。
切勿将 .dcu 与源文件放在同一文件夹中;始终为您的包设置 "unit output directory" 选项(也在 Base
构建配置中);我推荐 $(BDSCOMMONDIR)\MyPacks$(Config)$(Platform)
作为你的包的目录;如果源 (.pas) 文件夹中已有 .dcu,请删除它们,这与创建这些 .dcu 的 Delphi 版本无关。
永远不要将依赖包源的路径添加到搜索路径,只添加编译的 .dcu 的路径(如果您遵循之前的建议,则为 $(BDSCOMMONDIR)\MyPacks$(Config)$(Platform)
)。
我写了 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\Win32dcu目录放在了库路径和浏览路径上。 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 0000}
{$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.
Delphi IDE 在 editing/compiling 包方面远非完美,但你应该解决你这边的问题 - 更好地配置你的包并且 Delphi 会正确编译它们。
我只能针对给定的信息给您一般性建议:
如果您需要 2 个包的公共包含文件,请为该文件创建一个单独的目录,并将此目录添加到两个包的搜索路径中(在
Base
构建配置中)。切勿将 .dcu 与源文件放在同一文件夹中;始终为您的包设置 "unit output directory" 选项(也在
Base
构建配置中);我推荐$(BDSCOMMONDIR)\MyPacks$(Config)$(Platform)
作为你的包的目录;如果源 (.pas) 文件夹中已有 .dcu,请删除它们,这与创建这些 .dcu 的 Delphi 版本无关。永远不要将依赖包源的路径添加到搜索路径,只添加编译的 .dcu 的路径(如果您遵循之前的建议,则为
$(BDSCOMMONDIR)\MyPacks$(Config)$(Platform)
)。