Существует несколько сообщений о Segmentation Fault 11, но ни один из них не отвечает на мой вопрос:
Ранее я разместил код для простого тестового приложения, но он приведен для полноты.Windows 10, Delphi 10.2.3 с OSX High Sierra 10.13.6 и Xcode 9.4.1.
ВЕДУЩИЙ:
unit uDylibTest1;
interface
uses
System.SysUtils,
System.Types,
System.Diagnostics,
System.UITypes,
System.Classes,
System.Variants,
FMX.Types,
FMX.Controls,
FMX.Forms,
FMX.Graphics,
FMX.Dialogs,
FMX.StdCtrls,
FMX.Platform,
FMX.Controls.Presentation;
const
// Windows DLL Names
{$IFDEF MSWINDOWS}
TestDLL = 'pTestDLL.dll';
{$ENDIF MSWINDOWS}
// macOS DYLIB Names
{$IFDEF MACOS}
//TestDLL = 'libpTestDLL.dylib';
TestDLL = 'libpTestDLL.dylib';
{$ENDIF MACOS}
type
TfDylibTest = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TuDylibTest = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
{$IFDEF MSWINDOWS}
function say_Hello(Hello: string; out ReturnString: string): boolean; stdcall; external TestDLL Delayed;
{$ENDIF MSWINDOWS}
{$IFDEF MACOS}
function _say_Hello(Hello: string; out ReturnString: string): boolean; cdecl; external TestDLL;
{$ENDIF MACOS}
function local_say_hello(Hello: string): boolean; forward;
var
fDylibTest: TfDylibTest;
implementation
function local_say_hello(Hello: string): boolean;
begin
Result := True;
showmessage(Hello);
end;
{$R *.fmx}
{$R *.Macintosh.fmx MACOS}
{$R *.Windows.fmx MSWINDOWS}
procedure TfDylibTest.Button1Click(Sender: TObject);
var
b:boolean;
sType: string;
sDLLString: string;
begin
b := False;
sType := '';
// Call the DLL Function
{$IFDEF MSWINDOWS}
sDLLString := 'The string passed to the Windows DLL';
b := say_Hello(sDLLString, sType);
{$ENDIF MSWINDOWS}
{$IFDEF MACOS}
sDLLString := 'The string passed to the macOS DYLIB';
b := _say_Hello(sDLLString, sType);
{$ENDIF MACOS}
if b then
showmessage('Returned From: ' + sType + ': TRUE')
else
showmessage('Retur was: FALSE');
end;
procedure TfDylibTest.Button2Click(Sender: TObject);
var
b: boolean;
iTime2Auth: integer;
Opened: boolean;
i: integer;
begin
Opened := False;
// test the Waitnofreeze
iTime2Auth := 0;
b := False;
// Call the local Function
b := local_say_Hello('The string passed to the LOCAL function');
if b then
showmessage('Say Hello OK - LOCAL')
else
showmessage('Say Hello Failed - LOCAL');
end;
procedure TfDylibTest.FormClose(Sender: TObject; var Action: TCloseAction);
begin
showmessage('[Test App] onClose');
end;
procedure TfDylibTest.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
canClose := True;
showmessage('[Test App] onCloseQuery');
end;
procedure TfDylibTest.FormCreate(Sender: TObject);
begin
showmessage('[Test App] onCreate');
end;
initialization
showmessage('[Test App] Initialization'); <<<<-- THIS IS EXECUTED
finalization
showmessage('[Test App] Finalization'); <<<<-- THIS IS NOT EXECUTED
end.
И DYLIB:
unit uTestDLL;
interface
uses
System.Diagnostics,
System.Classes;
// External functions and procedures
{$IFDEF MSWINDOWS}
function say_Hello(Hello: string; out ReturnString: string): boolean; stdcall; forward;
{$ENDIF MSWINDOWS}
{$IFDEF MACOS}
function _say_Hello(Hello: string; out ReturnString: string): boolean; cdecl; forward;
{$ENDIF MACOS}
exports
{$IFDEF MSWINDOWS}
say_Hello;
{$ENDIF MSWINDOWS}
{$IFDEF MACOS}
_say_Hello;
{$ENDIF MACOS}
Implementation
{$IFDEF MSWINDOWS}
function say_Hello(Hello: string; out ReturnString: string): boolean; stdcall; export;
{$ENDIF MSWINDOWS}
{$IFDEF MACOS}
function _say_Hello(Hello: string; out ReturnString: string): boolean; cdecl; export;
{$ENDIF MACOS}
begin
{$IFDEF MSWINDOWS}
ReturnString := 'Windows DLL, Received: ' + Hello;
{$ENDIF MSWINDOWS}
{$IFDEF MACOS}
ReturnString := 'macOS DYLIB, Received: ' + Hello;
{$ENDIF MACOS}
Result := True;
end;
end.
В основном функции в DYLIB передается строковый параметр, он возвращает TRUE с переменной OUT другой строки, которая доказывает, что данные были переданы в функцию DYLIB и возвращены.
У меня есть простые операторы showmessage () в вызывающем приложении для таких вещей, как onCloseQuery, onClose и т. Д., Все они показывают, что все работает, как должно, до закрытия приложения (выполнение onCloseQuery, выполнение onClose и примерно полсекунды)до секунды после того, как все выключается, появляется сообщение о проблеме).Обратите внимание, что раздел инициализации выполнен, но раздел финализации НЕ выполнен (хотя он выполняется при работе в режиме Win32).Я поместил ссылку на диск Google в журнал ошибок. Отчет о проблемах OSX
Когда я смотрю на трассировку стека, ни один из двух моих файлов (DylibTest и libpTesDLL.DYLIB) не упоминается, это все RTL / системные блоки.Я гуглил Seg Fault 11 и искал форум, но ничего не похоже.
Буду признателен за совет, как мне поступить?