【发布时间】:2019-07-28 13:22:21
【问题描述】:
我们刚刚开始在 Delphi 中将我们的一些项目迁移到 64 位,我们还有几个正在使用的 3rd 方 Delphi 库。 传统上,当我们使用 3rd 方库时,我们会使用设计时包 .bpl 或让编译器编译源代码。
但是,在 64 位中,我们似乎必须完全不同。如果我们要编译 64 位库,我们需要使用 DCU。
例如,我们有一个需要在 64 位中使用的库。该库支持 64 位。为了让它工作,我必须将运行时包编译为 64 位,然后将编译器指向输出的 64 位 DCU 文件。当我尝试将库从源代码编译为 64 位时,我们会遇到各种错误。
所以我的问题基本上是:为什么/如何通过运行时包编译 64 位源代码就好了,但是当我们尝试编译为 64 位源代码时会出错?
为了进一步说明以防万一不清楚:
A.将所有源文件放在搜索路径上。将程序编译为 64 位。错误。
B.从 3rd 方库中打开提供的运行时 .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 位的二进制文件。此外,如果你想重新编译库,你需要在 clinesuite_x.dproj 文件中切换平台选项,然后重新编译它(其中 _x 取决于你的 Delphi 版本,例如,在 Delphi 10.3 Rio 的情况下,项目文件将是 clinesuite_103.dproj)。
所以我就是这样做的。我打开那个 .Dproj 文件并编译它。一旦我这样做了,它就会创建一个 Win64/Output 文件夹,其中包含库的所有 dcus。我可以链接到它并在 win64 位下工作就好了。
我的问题是为什么当我通过“提供的 .dproj 文件”编译时它可以工作,但当我通过源代码编译时却不行。
希望我能更好地表达我的要求。
【问题讨论】:
-
没有从运行时包编译源代码。运行时包包含已编译的可执行代码(如 DLL),除了对包中代码的引用外,它们中的任何内容都不会编译到您的应用程序中。编译到应用程序中的部分取自包以外的其他地方,可能是 .dcu 或 .dcp 文件。编译 64 位应用程序以使用 64 位包没有问题。编译一个 64 位版本的包,然后将使用它的应用程序编译为 64 位。
-
一个适合我。你有什么不同?
-
可能库的
.dproj文件中有{$DEFINE ...}定义的一些符号,用于对库的源文件进行条件编译.. -
嗯,edt 有帮助。编译器错误很有帮助。问题将是编译器选项。该代码可能需要
{A+},其中定义了clSpecialType类型。它会从包 dproj 文件中提取它,但不会从您的 lr 代码的 dproj 文件中提取。实际上,编译器选项应该由库中的所有文件都包含的库包含文件强制执行。但是这个库在这方面可能很草率。 -
FWIW,这意味着库可能没有在 .pas 文件中设置任何相关设置。这应该变得更容易,并且更少依赖外部设置。
标签: delphi