【发布时间】:2021-02-18 10:42:06
【问题描述】:
使用 Delphi 10.3... 我下载了最新的 Indy 文件,其 IndySystem260.dpk 文件如下所示:
package IndySystem260;
{$R *.res}
{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO OFF}
{$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}
{$DEFINE VER330}
{$ENDIF IMPLICITBUILDING}
{$DESCRIPTION 'Indy 10 System'}
{$RUNONLY}
{$IMPLICITBUILD ON}
// RLebeau: cannot use IdCompilerDefines.inc here!
{$DEFINE HAS_PKG_RTL}
{$IFDEF NEXTGEN}
{$IFDEF IOS}
// there is no RTL package available for iOS
{$UNDEF HAS_PKG_RTL}
{$ENDIF}
{$ENDIF}
{$IFDEF HAS_PKG_RTL}
requires
rtl;
{$ENDIF}
{$IFNDEF WINDOWS}
{$IFDEF MSWINDOWS}
{$DEFINE WINDOWS}
{$ENDIF}
{$ENDIF}
contains
IdAntiFreezeBase in 'IdAntiFreezeBase.pas',
IdBaseComponent in 'IdBaseComponent.pas',
IdCTypes in 'IdCTypes.pas',
IdComponent in 'IdComponent.pas',
IdException in 'IdException.pas',
IdGlobal in 'IdGlobal.pas',
IdIDN in 'IdIDN.pas',
IdResourceStrings in 'IdResourceStrings.pas',
{$IFNDEF WINDOWS}
IdResourceStringsUnix in 'IdResourceStringsUnix.pas',
IdResourceStringsVCLPosix in 'IdResourceStringsVCLPosix.pas',
{$ENDIF}
IdStack in 'IdStack.pas',
IdStackBSDBase in 'IdStackBSDBase.pas',
IdStackConsts in 'IdStackConsts.pas',
{$IFDEF WINDOWS}
IdStackWindows in 'IdStackWindows.pas',
{$ELSE}
IdStackVCLPosix in 'IdStackVCLPosix.pas',
{$ENDIF}
IdStream in 'IdStream.pas',
IdStreamVCL in 'IdStreamVCL.pas',
IdStruct in 'IdStruct.pas',
{$IFDEF WINDOWS}
IdWinsock2 in 'IdWinsock2.pas',
IdWship6 in 'IdWship6.pas'
{$ELSE}
IdVCLPosixSupplemental in 'IdVCLPosixSupplemental.pas'
{$ENDIF}
;
end.
只要我将Project Options > Building > Delphi Compiler > DCP output directory 更改为..\..\..\Delphi 10.3\DCP\$(Platform)\$(Config),DPK 就会更改为:
package IndySystem260;
{$R *.res}
{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO OFF}
{$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}
{$DESCRIPTION 'Indy 10 System'}
{$RUNONLY}
{$IMPLICITBUILD OFF}
rrequires
rtl;
$contains
IdAntiFreezeBase in 'IdAntiFreezeBase.pas',
IdBaseComponent in 'IdBaseComponent.pas',
IdCTypes in 'IdCTypes.pas',
IdComponent in 'IdComponent.pas',
IdException in 'IdException.pas',
IdGlobal in 'IdGlobal.pas',
IdIDN in 'IdIDN.pas',
IdResourceStrings in 'IdResourceStrings.pas',
IdStack in 'IdStack.pas',
IdStackBSDBase in 'IdStackBSDBase.pas',
IdStackConsts in 'IdStackConsts.pas',
IdStackWindows in 'IdStackWindows.pas',
IdStream in 'IdStream.pas',
IdStreamVCL in 'IdStreamVCL.pas',
IdStruct in 'IdStruct.pas',
IdWinsock2 in 'IdWinsock2.pas',
IdWship6 in 'IdWship6.pas' {$ENDIF};
d.
有人知道为什么会这样吗?如果不对 DPK 文件进行手动编辑,是否可以防止这种情况发生?我在 XE3 中也注意到了这一点。
我在 Indy 说明页面上注意到以下内容:
跨平台编译注意事项:
当前的 Indy 10 包项目是为 Windows 编译设置的。 IndySystem 和 IndyProtocols 包确实有一些 其中特定于平台的单元,通过有条件地编译 DPK 文件中的 IFDEF 语句。这对命令行很好 编译,但 IDE 通常不处理 DPK 文件中的 IFDEF 很好,这也可能导致关联的 DPROJ 文件出现 与其 DPK 文件同步。因此,如果您愿意,这可能会导致问题 通过 IDE 为非 Windows 平台编译 Indy 10(在 Delphi 中) 支持此的版本)。您可能需要编辑 IndySystem 删除 IFDEF 并替换 IdStackWindows 的项目, IdWinsock2 和 IdWship6 单元与 IdStackVCLPosix 和 IdVCLPosixSupplemental units 代替,然后编辑 IndyProtocols 删除 IFDEF 以及 IdAuthenticationSSPI 和 IdSSPI 的项目 单位。也许在未来的版本中,我们将尝试自动化/清理 这个更好。
它可能会说So this may lead to issues if you want to compile Indy 10 via the IDE for non-Windows platforms,但我怀疑我必须在更改选项后将 DPK 代码粘贴回去。
【问题讨论】:
-
DPR/DPK 中的条件定义在 IDE 中表现不佳。