IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Apple Discussion :

path library dynamique


Sujet :

Apple

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut path library dynamique
    Bonjour,

    Nouveau sur Mac, je ne parviens pas à spécifier au moment de l'édition de liens le chemin qui sera utilisé pour chercher une library dynamique.

    Quelque chose doit m'échapper... Mon OS est Snow Léopard. Par exemple :

    Fichier foo/foo.hpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef _FOO_HPP
    #define _FOO_HPP
    
    #include <iostream>
    
    using namespace std;
    
    void foo();
    
    #endif
    Fichier foo/foo.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "foo.hpp"
    
    void foo(){
        cout << "hello world." << endl;
    }
    Le fichier main/main.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "foo.hpp"
    
    int main(){
        foo();
    }
    et voici les commandes que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #creating foo library
    cd foo
    g++ -fPIC -c foo.cpp
    g++ -dynamiclib -install_name libfoo.dylib -o libfoo.dylib foo.o
    cd ..
    
    #linking with foo library
    cd main
    g++ -fPIC -I../foo -c main.cpp
    g++ -undefined dynamic_lookup main.o -L../foo -Wl,-rpath,../foo -lfoo -o main
    ./main
    Jusqu'ici tout va bien, les commandes ont réussies.

    Si je regarde avec otool :
    Je vois que le chemin donné avec -rpath n'est pas pris en compte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    main:
            libfoo.dylib (compatibility version 0.0.0, current version 0.0.0)
            /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
            /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)
    Si j'exécute :

    La library n'est pas trouvée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dyld: Library not loaded: libfoo.dylib
      Referenced from: (...)/main/./main
      Reason: image not found
    Trace/BPT trap
    Si maintenant je copie la library dans le répertoire d'éxecution, l'éxecution se déroule correctement.

    Quelques infos supplémentaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    uname -a
    Darwin mp-57052 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386
    
    g++ -v
    Using built-in specs.
    Target: i686-apple-darwin10
    Configured with: /var/tmp/gcc/gcc-5666.3~6/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1
    Thread model: posix
    gcc version 4.2.1 (Apple Inc. build 5666) (dot 3)
    Quelle est la bonne option à utiliser? Merci d'avance à ceux qui pourront m'orienter vers la solution!

    David

  2. #2
    Membre expérimenté Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Points : 1 312
    Points
    1 312
    Par défaut
    Tout est dans le nom d'installation indiqué lors de l'édition des liens de ta bibliothèque.

    En indiquant -install_name libfoo.dylib, alors ton exécutable cherchera "libfoo.dylib". Si tu mets -install_name /toto/libfoo.dylib, ton exécutable cherchera "/toto/libfoo.dylib". Si l'OS ne trouve pas la bibliothèque à cette adresse, il vérifiera également dans /usr/lib et /usr/local/lib.

    Donc je ne sais pas où tu voudrais mettre ta bibliothèque par rapport à ton programme?

    Enfin note que pour prendre effet, et que ton programme enregistre la bonne adresse, tu dois refaire la phase d'édition des liens de ton programme. Et -rpath ne fontionne pas de la même façon sous Mac OS X :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
         -rpath path
                     Add path to the runpath search path list for image being cre-
                     ated.  At runtime, dyld uses the runpath when searching for
                     dylibs whose load path begins with @rpath/.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -install_name name
                     Sets an internal "install path" (LC_ID_DYLIB) in a dynamic
                     library. Any clients linked against the library will record
                     that path as the way dyld should locate this library.  If
                     this option is not specified, then the -o path will be used.
                     This option is also called -dylib_install_name for compati-
                     bility.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup Ceylo pour les explications, j'y comprends mieux!

    Si ça peut être utile à quelqu'un, voici l'exemple précédent qui fonctionne,
    (j'ai rajouté les Makefile).

    .
    |-- foo
    | |-- foo.cpp
    | |-- foo.hpp
    | `-- Makefile
    |-- lib
    |-- main
    | |-- main.cpp
    | `-- Makefile
    |-- Makefile
    |-- Makefile.conf
    `-- README


    Bonne journée!


    Fichier: README
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Demonstrate how to create a single dynamic library containing a single function,
    then create a executable that links this library.
    
    Plese edit Makefile.conf and adjust INSTALL_DIR.
    Fichier: Makefile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    all:
    	cd foo ; make all
    	cd main ; make all
    
    clean:
    	cd foo ; make clean
    	cd main ; make clean
    
    test:
    	cd main;  make test
    Fichier: Makefile.conf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CC = g++
    CCFLAGS = -fPIC
    DYLIBFLAGS = -dynamiclib -install_name
    LDFLAGS = -undefined dynamic_lookup
    INSTALL_LIB = $(HOME)/dylib_demo/lib
    Fichier: foo/foo.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef _FOO_HPP
    #define _FOO_HPP
    
    #include <iostream>
    
    using namespace std;
    
    void foo();
    
    #endif
    Fichier: foo/foo.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "foo.hpp"
    
    void foo(){
        cout << "hello world." << endl;
    }
    Fichier: foo/Makefile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    include ../Makefile.conf
    
    LIB = $(INSTALL_LIB)/libfoo.dylib
    
    all: $(LIB) 
    
    $(LIB): foo.o
    	$(CC) $(DYLIBFLAGS) $(LIB) -o $(LIB) $<
    
    %.o: %.cpp
    	$(CC) $(CCFLAGS) -c $<
    
    clean:
    	rm -f *.o $(LIB)
    Fichier: main/main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "foo.hpp"
    
    int main(){
        foo();
    }
    Fichier: main/Makefile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    include ../Makefile.conf
    
    EXEC = main
    
    all: $(EXEC)
    
    $(EXEC): main.o
    	$(CC) $(LDFLAGS) $< -L$(INSTALL_LIB) -lfoo -o $@
    
    %.o: %.cpp
    	$(CC) $(CCFLAGS) -I../foo -c $<
    
    test:
    	./main
    
    clean:
    	rm -f *.o main

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/06/2013, 18h05
  2. Probleme a include une librarie dynamique
    Par Pierrick584 dans le forum Code::Blocks
    Réponses: 0
    Dernier message: 20/02/2012, 05h29
  3. Réponses: 3
    Dernier message: 24/01/2012, 08h43
  4. [JNI] modification de java.library.path
    Par alex'l dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 08/09/2006, 13h45
  5. [JNI]problème option -Djava.library.path
    Par sylviiie dans le forum ANT
    Réponses: 2
    Dernier message: 18/05/2004, 08h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo