Gemeinsame Bibliotheken für Mac OS X

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Geräteübergreifende Anwendungen - Index

Gemeinsame Verwendung von Bibliotheken mit Mac OS X-Anwendungen

Bei der Entwicklung von plattformübergreifenden gemeinsamen Bibliotheken in Object Pascal müssen Sie einige plattformspezifische Anforderungen beachten. Insbesondere für Funktionen, die in Bibliotheken für OS X 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 OS X-Version jeder dynamisch geladenen Funktion muss mit einem führenden Unterstrich beginnen ("_").

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

Der führende Unterstrich ist für OS X-Anwendungen notwendig, weil die Standardbibliotheksfunktion dlsym() (entspricht ungefähr 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 Mac OS X 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

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

  • Windows: TestProc()
  • OS X: _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.

Wird die Funktion in OS X mit System.SysUtils.GetProcAddress() oder Posix.Dlfcn.dlsym() referenziert, wird der führende Unterstrich ("_") nicht verwendet, weil in OS X 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 deren Deklarationen im Quelltext gelinkt werden. Statisch gelinkte Funktionen aus Bibliotheken können in ihren Namen einen führenden Unterstrich enthalten, und das ist in OS X auch oft der Fall, aber erforderlich ist dies nur für dynamisch geladene Funktionen.

Beachten Sie auch, dass bei Bibliotheken für OS X 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