为什么我可以通过运行时包而不是源代码来编译64位Delphi库?

时间:2019-03-06 19:11:56

标签: delphi

我们刚刚开始将某些项目迁移到Delphi中的64位,我们也有一些正在使用的第三方Delphi库。 传统上,当我们使用第三方库时,我们使用设计时程序包.bpl进行操作,或者我们只是让编译器来编译源代码。

但是,在64位中,我们似乎必须完全不同。如果要编译64位库,则需要使用DCU。

例如,我们有一个需要在64位中使用的库。该库支持64位。为了使其正常工作,我必须将运行时程序包编译为64位,然后将编译器指向输出的64位DCU文件。当我尝试从源代码将库编译为64位时,会遇到各种错误。

所以我的问题基本上是:为什么/如何通过64位运行时包编译源代码就好了,但是当我们尝试仅以64位源代码编译时,会出错吗?

为了进一步说明,以防万一,还不清楚:

A。将所有源文件放在搜索路径上。将程序编译为64位。错误。

B。从第3方库打开提供的运行时.dproj。将运行时库编译为64位。将输出的64位DCU放在搜索路径上。编译程序。效果很好。

谢谢

编辑:我将要更具体一点,因为看来我在传达我要问的问题时失败了。

我们正在使用用于Delphi的Clever Internet Suite 9.1。 当以32位编译时,我们不使用设计时软件包。我们通过Delphi的搜索路径直接链接到源代码。效果很好。

当我将应用程序更改为64位版本时,会出现此错误:

  

[dcc64错误] clSocket.pas(1971):E2089无效的类型转换

有问题的代码示例(稍作更改):

procedure cldostuff.WndProc(var Message: TMessage);
begin
  if (Message.Msg = cl_const)
    and (clSpecialType(Message).LookupHandle = FLookupHandle) then
  begin
    syncerror:= clSpecialType(Message).syncerror;
    SetEvent(FCompleted);
  end;
end;

该错误与TMessage的转换有关。我了解为什么TMessage会导致错误。我不关心该错误。 我很好奇如何通过“包”进行编译,但在DCU中却没有。显然,我误用了“运行时程序包”的术语。我将准确地发布聪明的开发人员告诉我的有关如何使用64位的信息。

  

Clever Internet Suite完全支持64位平台。安装程序包括32位和64位的二进制文件。另外,如果要重新编译该库,则需要在clinetsuite_x.dproj文件中切换platform选项,然后重新编译(其中_x取决于您的Delphi版本,例如,对于Delphi 10.3 Rio,则为项目文件将是clinetsuite_103.dproj)。

所以我做到了。我打开该.Dproj文件并进行编译。完成后,它将创建一个Win64 / Output文件夹,其中包含库的所有记录。我可以链接到该文件并在win64位上正常工作。

我的问题是为什么当我通过“提供的.dproj文件”进行编译时会起作用,而当我通过源代码进行编译时却无法起作用。

希望我在表达自己的要求方面做得更好。

1 个答案:

答案 0 :(得分:2)

该编译器错误通常是由两个大小不同的值类型之间的类型转换引起的。如果该代码在某些编译方案中有效,而在其他编译方案中无效,那么显而易见的结论是,在这些方案中,记录对齐选项会有所不同。

软件包dproj文件很可能定义了对齐的记录,即{$ALIGN ON}。但是您的项目没有。也许它使用压缩对齐方式{$ALIGN 1}

确保使用与程序包dproj文件中指定的选项相同的选项来编译库中的所有单元。通常,这是由库提供的,该库提供一个指定所需选项的包含文件,然后该包含文件包含在所有单元中。这样可以将代码与主机dproj文件中指定的编译器选项(与该代码所需的选项不兼容)隔离。

由于具有源代码,因此可以添加这样的公共包含文件。从长远来看,您应该要求库的开发人员使代码独立,而不需要关键编译器选项的外部规范。