【问题标题】:Changing Compiler Output Locations in Project Options for Indy Package corrupts its DPK file在 Indy 包的项目选项中更改编译器输出位置会损坏其 DPK 文件
【发布时间】: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 中表现不佳。

标签: delphi indy


【解决方案1】:

这看起来更像是混合换行符的“众所周知”问题。 可能原始文件具有 unix 结尾,并且 IDE 中的更改将某些行转换为 PC 结尾。

【讨论】:

  • 可能是这样,但不管是什么,只要您编辑该包的项目选项,IDE 就会完全弄乱该包代码。
  • 有趣的是,Indy DPK 只有 LineFeeds,但在用 CarraigeReturn + LineFeeds 替换它们后仍然存在问题,所以我假设这个问题是“IDE 不能很好地使用条件定义”
  • CR+LF 至少可以防止 requires 子句前面的不正确的附加 r 以及 contains 前面的 $
  • 我确认了这个错误,这可能是因为 github 和 git 使用而发生的?!?这可能确实使用了不同的行尾/新行标记......奇怪的东西。我并不是说换行符是问题的原因。我只是确认使用 github/git 和 delphi 10.3 和 dpl 文件观察到相同的行为!前面的字母与原始帖子/问题中描述的那个人完全一样。这就是我所说的奇怪的东西......绝对感觉像是某种奇怪的 Delphi IDE 问题。实际上这个 bug 在 Delphi 10.4 中仍然存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多