Gemeinsame Bibliotheken für macOS

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu MacOS-Anwendungsentwicklung

Gemeinsame Verwendung von Bibliotheken mit macOS-Anwendungen

Bei der Entwicklung von geräteübergreifenden gemeinsamen Bibliotheken in Delphi müssen Sie einige plattformspezifische Anforderungen beachten. Insbesondere für Funktionen, die in Bibliotheken für macOS dynamisch geladen und aufgerufen werden sollen, müssen Sie Folgendes ausführen:

  • Beginnen Sie die Namen von dynamisch geladenen Funktionen mit einem führenden Unterstrich ("_").
  • Verschieben Sie die "exports"-Anweisung aus der .dpr-Datei in die .pas-Datei.

Diese beiden Empfehlungen werden in diesem Thema näher beschrieben.

Die macOS-Version einer dynamisch geladenen Funktion muss mit einem führenden Unterstrich beginnen ("_")

Dies entspricht den Namenskonventionen für die macOS-Zielplattform, die einen führenden Unterstrich ("_") in Namen von Funktionen vorschreiben, die nach OS X exportiert werden.

Der führende Unterstrich ist für macOS-Anwendungen notwendig, weil die Standardbibliotheksfunktion dlsym() (entspricht etwa GetProcAddress() in der WinAPI) einen führenden Unterstrich zu Funktionsnamen hinzufügt, auf die dynamisch zugegriffen wird. Die Bibliothek wird wie erwartet erstellt und beim Compilieren statisch gelinkt, wenn aber Funktionen in einem Programm dynamisch aufgerufen werden, kann auf diese nur zugegriffen werden, wenn der führende Unterstrich vorhanden ist.

Exports-Anweisungen werden in .dpr-Dateien nicht akzeptiert

Verschieben Sie bei Bibliotheken für macOS die relevanten "exports"-Anweisungen aus der für die Bibliothek verwendeten .dpr-Datei in die .pas-Datei, in der die exportierten Funktionen definiert werden.

Weitere Informationen finden Sie unter Dynamisch ladbare Bibliotheken schreiben und Moduldefinitionsdateien.

Codebeispiel

Mit der folgenden Unit soll eine Funktion mit plattformspezifischen Funktionsnamen exportiert werden:

  • Windows: TestProc()
  • macOS: _TestProc()
 unit uTestLib;
 
 interface
 
 {$IFDEF MACOS}
 function _TestProc(var I: Integer): Integer; cdecl;
 {$ELSE}
 function TestProc(var I: Integer): Integer; cdecl;
 {$ENDIF}
 
 exports 
 {$IFDEF MACOS}
   _TestProc;
 {$ELSE}
   TestProc;
 {$ENDIF}
 
 implementation
 {$IFDEF MACOS}
 function _TestProc(var I: Integer): Integer; cdecl; export;
 {$ELSE}
 function TestProc(var I: Integer): Integer; cdecl; export;
 {$ENDIF}
 begin
   Result := I;
 end;
 end.

Die Funktion wird in macOS folgendermaßen referenziert:

  • System.SysUtils.GetProcAddress()
  • Oder Posix.Dlfcn.dlsym()

Hier wird der führende Unterstrich ("_") nicht verwendet, weil in macOS davon ausgegangen wird, dass alle dynamisch geladenen Funktionen einen führenden Unterstrich haben und dieser automatisch hinzugefügt wird.

Hinweis: Diese Anforderung betrifft nur dynamisch geladene Funktionen und nicht diejenigen, die statisch anhand der Direktive "external" in den Deklarationen im Quelltext gelinkt werden. Statisch gelinkte Funktionen aus Bibliotheken können in ihren Namen einen führenden Unterstrich enthalten, und das ist in macOS auch oft der Fall, aber erforderlich ist dies nur für dynamisch geladene Funktionen.

Beachten Sie auch, dass bei Bibliotheken für macOS die "exports"-Klausel nicht erkannt wird, wenn sie sich in der Hauptquelldatei der Bibliothek befindet, d. h. in der .dpr-Datei der Bibliothek. Die "exports"-Klausel für exportierte Funktionen muss sich in einer Unit-Datei, wie im obigen Beispiel gezeigt, befinden.

Weitere Überlegungen

Erzeugen Sie Ihre Bibliothek mit Laufzeit-Packages

Die Bibliothek (DLL) und die Anwendung müssen mit Laufzeit-Packages erzeugt werden. Ansonsten erhält sowohl die Anwendung als auch die Bibliothek einen eigenen Satz von allgemeinen globalen Objekten, wie "Platform" und "Application".

Aufrufen von LoadLibrary

LoadLibrary muss aufgerufen werden, nachdem die Anwendung gestartet wurde. Das Laden der DLL während der Initialisierung ist nicht möglich.

Siehe auch