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