Was sind die Unterschiede zwischen .so und .dylib auf osx?
.dylib ist die dynamische Bibliothek-Erweiterung für OSX, aber es ist mir nie klar, wenn ich nicht kann /sollte nicht mit einem traditionellen unix .so shared object.
Einige der Fragen, die ich habe:
- Auf einer konzeptionellen Ebene, was sind die wichtigsten Unterschiede zwischen .also und .dylib?
- Wann kann/sollte ich einen über den anderen?
- Zusammenstellung tricks & Tipps (Zum Beispiel, der Ersatz für gcc-shared -fPIC, denn das funktioniert nicht auf osx)
InformationsquelleAutor der Frage Trent Davies | 2010-02-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Mach-O Objekt-Datei-format von Mac OS X für ausführbare Dateien und Bibliotheken unterscheidet zwischen shared libraries und dynamisch geladene Module. Verwenden
otool -hv some_file
sehen Sie den Dateityp vonsome_file
.Mach-O shared libraries haben die Datei-Typ
MH_DYLIB
und tragen die Erweiterung .dylib. Sie können verknüpft werden, gegen die mit den üblichen statischen linker flags, z.B.-lfoo
für libfoo.dylib. Sie können erstellt werden, indem die-dynamiclib
flag für den compiler. (-fPIC
ist der Standardwert und muss nicht angegeben werden.)Ladbare Module sind sogenannte "bundles" im Mach-O sprechen. Sie haben die Dateityp
MH_BUNDLE
. Sie tragen können eine beliebige Erweiterung, die Erweiterung.bundle
empfohlen von Apple, aber die meisten portierte software verwendet.so
Gründen der Kompatibilität. In der Regel werden Sie bundles für pluginsdie Erweiterung einer Anwendung; in solchen Situationen, das bundle wird link gegen die Anwendungsdatei, um den Zugang zu der Anwendung exportiert-API. Sie können erstellt werden, indem die-bundle
flag für den compiler.Beide dylibs und bundles können dynamisch geladen werden, mit der
dl
APIs (z.B.dlopen
dlclose
). Es ist nicht möglich, link gegen Bündel, als ob Sie gemeinsam genutzte Bibliotheken. Es ist jedoch möglich, dass ein bundle verknüpft ist, gegen einen echten gemeinsamen Bibliotheken; diese werden automatisch geladen, wenn das bundle geladen wird.Historisch gesehen, waren die Unterschiede mehr als deutlich. In Mac-OS X 10.0, es gab keine Möglichkeit, das dynamische laden von Bibliotheken. Eine Reihe von dyld-APIs (z.B.
NSCreateObjectFileImageFromFile
NSLinkModule
) eingeführt wurden mit 10.1 zum laden und entladen von bundles, aber Sie funktionieren nicht für die dylibs. Eindlopen
Kompatibilität Bibliothek, arbeitete mit bundles Hinzugefügt wurde in 10.3; 10.4,dlopen
wurde umgeschrieben, um eine native Teil der dyld und Unterstützung für das laden (aber nicht entladen) dylibs. Schließlich 10.5 Unterstützung für die Verwendung vondlclose
mit dylibs und veraltet der dyld-APIs.Auf ELF Systeme wie Linux, beide verwenden das gleiche Dateiformat; jedes Stück von shared code kann verwendet werden, als Bibliothek und für die dynamische Belastung.
Schließlich, beachten Sie, dass in Mac OS X, "bundle" kann auch finden Sie Verzeichnisse mit einer standardisierten Struktur, die enthält ausführbaren code und die Ressourcen, die durch diesen code. Es gibt einige konzeptionelle überschneidungen (insbesondere mit "ladbare bundles" wie plugins, die in der Regel enthalten ausführbaren code in form eines Mach-O-bundle), aber Sie sollten nicht verwechselt werden mit Mach-O-bundles, die oben diskutiert.
Zusätzliche Verweise:
InformationsquelleAutor der Antwort Miles
Die Datei .so ist nicht eine UNIX-Datei-Erweiterung für gemeinsam genutzten Bibliothek.
Es passiert einfach zu sein ein Allgemeines.
Überprüfen Linie 3b auf ArnaudRecipes sharedlib Seite
Grundsätzlich .dylib ist die mac-Datei-Erweiterung verwendet, um anzugeben, dass eine shared lib.
InformationsquelleAutor der Antwort Martin York
Den Unterschied zwischen .dylib und .also auf mac os x ist, wie Sie kompiliert werden. Für .also Dateien, die Sie verwenden -geteilt und für .dylib-dynamiclib. Beide .also und .dylib sind austauschbar, wie die dynamische Bibliothek-Dateien und haben entweder ein Typ wie DYLIB oder Paket. Hier ist die Anzeige der verschiedenen Dateien, die dies zeigen.
Dem Grund sind die beiden äquivalent auf Mac OS X ist für die rückwärts-Kompatibilität mit anderen UNIX-OS-Programme kompilieren, die .also Datei-Typ.
Zusammenstellung Hinweise: ob Sie zusammenzustellen .so-Datei oder eine .dylib-Datei, die Sie einfügen müssen Sie den richtigen Pfad in die dynamische Bibliothek während der Verknüpfung Schritt. Sie tun dies, indem Sie -install_name und den Pfad der Datei auf die Verknüpfung Befehl. Wenn Sie nicht dies tun, werden Sie laufen in das problem, in diesem Beitrag zu sehen: Mac Dynamische Bibliothek Verrücktheit (Fortran Nur).
InformationsquelleAutor der Antwort Zachary Kraus
Nur eine Beobachtung, die ich gerade erstellt, beim Bau der naiv-code auf OSX mit cmake:
cmake ... -DBUILD_SHARED_LIBS=OFF ...
erstellt .also Dateien
während
cmake ... -DBUILD_SHARED_LIBS= ...
erstellt .dynlib-Dateien.
Vielleicht hilft niemanden.
InformationsquelleAutor der Antwort user2996950