Delphi Indy idHTTP 导致 Mac 应用退出

Delphi Indy idHTTP causes Mac app to quit

在 Delphi 10.4.1 MacOS 项目上放置一个 idHTTP 组件并让它 Get() 一个文件会导致应用程序退出。

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

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

Application Specific Information:
/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

错误信息是self-explanatory。 Indy 正在尝试加载 unversioned 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。你可以试试看。