问题描述
将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。您可以尝试看看。