Quelles sont les différences entre.et alors?dylib sur osx?

.dylib est l'extension de la Bibliothèque dynamique sur OSX, mais cela n'a jamais été clair pour moi quand je ne peux pas / ne devrais pas utiliser un unix traditionnel .so shared object.

quelques-unes des questions que j'ai:

  • au niveau conceptuel, quelles sont les principales différences entre .et alors ?dylib?
  • Quand peut/doit-je utiliser l'un plutôt que l'autre?
  • Compilation Trucs & Astuces (par exemple, le remplacement pour gcc - partagé-fPIC, puisque cela ne fonctionne pas sur osx)
171
demandé sur Trent Davies 2010-02-26 08:31:20

4 réponses

le format de fichier objet Mach-O utilisé par Mac OS X pour les exécutables et les bibliothèques distingue bibliothèques partagées et modules chargés dynamiquement . Utilisez otool -hv some_file pour voir le type de fichier some_file .

Les bibliothèques partagées

Mach-O ont le type de fichier MH_DYLIB et portent l'extension .dylib. Ils peuvent être reliés avec les indicateurs statiques habituels, par exemple: -lfoo pour libfoo.dylib. Ils peuvent être créés en passant le drapeau -dynamiclib au compilateur. ( -fPIC est la valeur par défaut et n'a pas besoin d'être spécifié.)

Les modules chargeables

sont appelés" faisceaux " dans le langage Mach-O. Ils ont le type de fichier MH_BUNDLE . Ils peuvent porter n'importe quelle extension; L'extension .bundle est recommandée par Apple, mais la plupart des logiciels portés utilisent .so pour des raisons de compatibilité. Généralement, vous utiliserez faisceaux pour plugins qui s'étendent de la demande; dans de telles situations, l'ensemble aura lien à l'encontre de l'exécutable de l'application pour accéder à l'application de l'API exportées. Ils peuvent être créés en passant le drapeau -bundle au compilateur.

les dylibes et les faisceaux peuvent être chargés dynamiquement à l'aide de L'APIs dl (par exemple dlopen , dlclose ). Il n'est pas possible de faire le lien avec des paquets comme s'ils étaient des bibliothèques partagées. Cependant, il est possible qu'un paquet soit lié à des bibliothèques partagées réelles; celles-ci seront chargées automatiquement lorsque le paquet est chargé.

Historiquement, les différences étaient plus importants. Dans Mac OS X 10.0, il n'y avait aucun moyen de charger dynamiquement les bibliothèques. Un ensemble d'APIs dyld (par exemple NSCreateObjectFileImageFromFile , NSLinkModule ) a été introduit avec 10.1 Pour charger et décharger les faisceaux, mais ils ne fonctionnaient pas pour les dylibs. Une bibliothèque de compatibilité dlopen qui a fonctionné avec les faisceaux ont été ajoutés en 10.3; en 10.4, dlopen a été réécrit pour être une partie native de dyld et a ajouté un support pour le chargement (mais non le déchargement) des dylibes. Enfin, 10.5 a ajouté le support pour l'utilisation de dlclose avec les dylibs et a déprécié les API dyld.

sur les systèmes ELF comme Linux, tous les deux utilisent le même format de fichier ; n'importe quel morceau de code partagé peut être utilisé comme une bibliothèque et pour le chargement dynamique.

enfin, soyez conscient que dans Mac OS X, "bundle" peut aussi se réfèrent à des répertoires avec une structure normalisée qui contient le code exécutable et les ressources utilisées par ce code. Il y a un certain chevauchement conceptuel (en particulier avec les "paquets chargeables" comme les plugins, qui contiennent généralement du code exécutable sous la forme d'un paquet Mach-O), mais ils ne doivent pas être confondus avec les paquets Mach-O discutés ci-dessus.

autres références:

147
répondu Miles 2015-05-05 23:45:38

le dossier .ce n'est donc pas une extension de fichier UNIX pour une bibliothèque partagée.

il se trouve que c'est une chose commune.

Check line 3b at ArnaudRecipes sharedlib page

en gros .dylib est l'extension de fichier mac utilisée pour indiquer un lib partagé.

17
répondu Martin York 2012-10-28 09:49:47

la différence entre .dylib et .ainsi, sur mac os x est la façon dont ils sont compilés. Pour .donc les fichiers que vous utilisez-partagé et pour .dylib que vous utilisez-dynamiclib. Les deux .donc et .les dylib sont interchangeables en tant que fichiers de bibliothèques dynamiques et ont un type comme DYLIB ou BUNDLE. Voici la lecture des différents fichiers montrant ceci.

libtriangle.dylib:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00       DYLIB    17       1368   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS



libtriangle.so:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00       DYLIB    17       1256   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS

triangle.so:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00      BUNDLE    16       1696   NOUNDEFS DYLDLINK TWOLEVEL

la raison pour laquelle les deux sont équivalents sur Mac OS X est pour rétrocompatibilité avec D'autres programmes UNIX OS qui compilent vers le .donc type de fichier.

notes de Compilation: si vous compilez un .donc file ou A.fichier dylib vous devez insérer le chemin correct dans la Bibliothèque dynamique pendant l'étape de lien. Vous faites cela en ajoutant-install_name et le chemin du fichier à la commande de lien. Si vous ne le faites pas, vous allez rencontrer le problème vu dans ce post: Mac Bibliothèque dynamique folie (peut être Fortran seulement) .

8
répondu Zachary Kraus 2017-05-23 11:47:24

juste une observation que je viens de faire en construisant du code naïf sur OSX avec cmake:

cmake ... - DBUILD_SHARED_LIBS = OFF ...

crée .so files

alors que

cmake ... - DBUILD_SHARED_LIBS=ON ...

crée .fichiers dynlib.

peut-être que cela aide n'importe qui.

2
répondu user2996950 2017-10-10 15:59:20