Comment puis-je créer une bibliothèque dynamique (dylib) avec Xcode?

voix
25

Je construis quelques utilitaires de ligne de commande dans Xcode (C, pas de cacao ordinaire). Je veux tous les utiliser ma version personnalisée de libpng, et je veux économiser de l' espace en partageant une copie de la bibliothèque parmi tous les executables (je ne me dérange pas re-distribution .dylibavec eux).

Est-ce que je dois faire quelque chose de magique pour obtenir libpng symboles d'exportation?

Est -ce que « Lien binaire avec les bibliothèques » construire lien de phase statique?

Docs d'Apple mentionnent le chargement des bibliothèques au moment de l' exécution avec dlopen, mais comment je peux faire Xcode créer exécutable sans se plaindre de symboles manquants?


Je pense que je l'ai pensé à elle:

  • libpng n'a pas été correctement relie, parce que je l'ai construit 32/64 bits executables et bibliothèque 32 bits. Paramètres de construction de la bibliothèque et executables doivent correspondre.

  • config.h de libpng doit avoir des tonnes de définit comme #define FEATURE_XXX_SUPPORTED

  • « Lien binaire avec les bibliothèques » construire la phase gère les bibliothèques dynamiques très bien, et la DYLD_FALLBACK_LIBRARY_PATHvariable d' environnement neccessaire pour le chargement .dylibs du paquet d'application.

Créé 11/10/2008 à 20:30
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
48

liaison dynamique sous Mac OS X, un petit exemple

Pas:

  1. créer une bibliothèque contenant libmylib.dylib de mymod.o
  2. compiler et lier un « callmymod » qu'il appelle
  3. appeler mymod de callmymod, en utilisant DYLD_LIBRARY_PATH et DYLD_PRINT_LIBRARIES

Problème: vous « juste » voulez créer une bibliothèque pour d'autres modules à utiliser. Cependant, il y a un tas impressionnant de programmes - gcc, ld, MacOSX libtool, dyld - avec zillions d'options, un peu de compost bien décomposé, et les différences entre MacOSX et Linux. Il y a des tonnes de pages de manuel (je compte 7679 + 1358 + 228 + 226 lignes 10.4.11 ppc), mais pas beaucoup d'exemples, ou des programmes avec un mode « me dire ce que vous faites ».

(La chose la plus importante dans la compréhension est de faire un aperçu simplifié pour vous-même: tirer quelques images, exécutez quelques petits exemples, expliquer à quelqu'un d'autre).

Contexte: OverviewOfDynamicLibraries pomme , Wikipedia Dynamic_library


Étape 1, créez libmylib.dylib -

mymod.c:
    #include <stdio.h>
    void mymod( int x )
    {
        printf( "mymod: %d\n", x );
    }
gcc -c mymod.c  # -> mymod.o
gcc -dynamiclib -current_version 1.0  mymod.o  -o libmylib.dylib
    # calls libtool with many options -- see man libtool
    # -compatibility_version is used by dyld, see also cmpdylib

file libmylib.dylib  # Mach-O dynamically linked shared library ppc
otool -L libmylib.dylib  # versions, refs /usr/lib/libgcc_s.1.dylib

Étape 2, compiler et lier callmymod -

callmymod.c:
    extern void mymod( int x );
    int main( int argc, char** argv )
    {
        mymod( 42 );
    }
gcc -c callmymod.c
gcc -v callmymod.o ./libmylib.dylib -o callmymod
    # == gcc callmymod.o -dynamic -L. -lmylib
otool -L callmymod  # refs libmylib.dylib
nm -gpv callmymod  # U undef _mymod: just a reference, not mymod itself

Étape 3, exécutez callmymod un lien vers libmylib.dylib -

export DYLD_PRINT_LIBRARIES=1  # see what dyld does, for ALL programs
./callmymod
    dyld: loaded: libmylib.dylib ...
    mymod: 42

mv libmylib.dylib /tmp
export DYLD_LIBRARY_PATH=/tmp  # dir:dir:...
./callmymod
    dyld: loaded: /tmp/libmylib.dylib ...
    mymod: 42

unset DYLD_PRINT_LIBRARIES
unset DYLD_LIBRARY_PATH

Cela met fin à un exemple minuscule; espérons qu'elle aide à comprendre les étapes.
(Si vous faites cela beaucoup, voir GNU Libtool qui est glibtool sur macs et SCons .)
Acclamations
- denis

Créé 05/02/2009 à 14:54
source utilisateur

voix
7

Vous avez probablement besoin de faire en sorte que la bibliothèque dynamique vous construisez a un fichier de symboles exporté qui répertorie ce qui devrait être exporté de la bibliothèque. Il est juste une simple liste des symboles, une par ligne, pour exporter.

En outre, lorsque votre bibliothèque dynamique est construit, il obtient un nom installation intégré dans ce qui est, par défaut, le chemin auquel il est construit. Par la suite tout ce qui lie contre elle chercher au chemin d' accès spécifié première et seule recherche après un (petit) ensemble de chemins par défaut décrits dans DYLD_FALLBACK_LIBRARY_PATHla dyld(1)page de manuel .

Si vous allez mettre cette bibliothèque à côté de vos executables, vous devez ajuster son nom pour faire référence à installer que. Il suffit de faire une recherche Google pour « installer le nom » devrait se présenter une tonne d'informations sur le faire.

Créé 12/10/2008 à 04:00
source utilisateur

voix
6

Malheureusement, dans mon expérience la documentation d'Apple est vétuste, redondant et manque beaucoup d'informations communes que vous auriez normalement besoin.

J'ai écrit un tas de choses sur ce sur mon site où je devais me FMOD (API Sound) pour travailler avec mon jeu de plate-forme de croix que nous avons développé à la fac. C'est un processus bizarre et je suis surpris que Apple ne pas ajouter plus d'informations sur leurs développeurs docs.

Malheureusement, comme le « mal » que Microsoft sont, ils le font en fait un bien meilleur travail de recherche après leurs devs avec la documentation (ce qui provient d'un évangéliste Apple).

Je pense que fondamentalement, ce que vous ne faites pas est Après avoir compilé votre .app Bundle. Vous devez ensuite exécuter une commande sur le /MyApp.app/contents/MacOS/MyApp binaire exécutable pour changer où l'exécutable cherche son fichier de bibliothèque. Vous devez créer une nouvelle phase de construction qui peut exécuter un script. Je ne vais pas expliquer ce processus encore une fois, je l'ai déjà fait en profondeur ici:

http://brockwoolf.com/blog/how-to-use-dynamic-libraries-in-xcode-31-using-fmod

J'espère que cela t'aides.

Créé 23/11/2008 à 02:33
source utilisateur

voix
5

Connaissez - vous la page de référence d' Apple dynamique Bibliothèque Sujets de programmation ? Il devrait couvrir la plupart de ce que vous avez besoin. Sachez qu'il existe une bibliothèques partagées , qui sont chargées sans condition au démarrage du programme et les bibliothèques chargées dynamiquement (faisceaux, IIRC) qui sont chargés à la demande, et les deux sont quelque peu différentes sur Mac OS X à partir des équivalents sous Linux ou Solaris.

Créé 12/10/2008 à 03:21
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more