Delphi Indy idHTTP导致Mac应用程序退出

问题描述

将idHTTP组件拖放到Delphi 10.4.1 MacOS项目上并使其具有Get()文件会导致应用程序退出

我不是在谈论未处理的异常。 MacOS 10.15.6在崩溃报告中因以下投诉而终止了该应用程序:

Exception Type:        EXC_CRASH (SIGABRT)
Exception Codes:       0x0000000000000000,0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

Application Specific @R_827_4045@ion:
/usr/lib/libcrypto.dylib
abort() called
Invalid dylib load. Clients should not load the unversioned libcrypto dylib as it does not have a stable ABI.

这是代码。 Get()必须传递一个实际文件。 (如果Get()结果为404,则会引发适当的异常。)

procedure TForm1.FormCreate(Sender: TObject);
var
  Stream: TMemoryStream;

begin
  Stream := TMemoryStream.Create;

  IdHTTP1.Get('https://www.bookup.com/cowupdates/build113.txt',Stream);

  // app crashes on Mac

解决方法

错误消息是不言自明的。 Indy正在尝试加载未版本化 libcrypto.dylib文件(用于OpenSSL),显然您的OSX系统不喜欢这样。

为避免这种情况,您可以在程序启动时调用IdOpenSSLSetCanLoadSymLinks(False)。有关更多详细信息,请参见Indy网站上的Changes for how OpenSSL is loaded on *Nix platforms。然后,只需确保系统上或至少在应用程序的文件夹中安装了OpenSSL 1.0.2或更早版本。

当前有一个开放的pull request,用于向Indy添加OpenSSL 1.1.x支持,但是我不知道它是否支持OSX。您可以尝试看看。