2012-08-30 1 views
0

Je dois créer une bibliothèque wrapper pour le code C qui enveloppe ma bibliothèque C++. Existe-t-il un moyen de créer cette bibliothèque wrapper de telle sorte que l'utilisateur doit lier uniquement cette bibliothèque wrapper et n'a pas à inclure toutes les bibliothèques (C++) sur la ligne de commande de l'éditeur de liens?Intégrer toutes les références externes lors de la création d'une bibliothèque statique

La structure de mon projet de test ressemble à ceci:

. 
├── lib 
│   ├── cpp 
│   │   ├── print.cc 
│   │   └── print.h 
│   ├── lib.cc 
│   ├── lib.h 
└── main.c 

Le main.c est un exemple d'application C qui utilise ma bibliothèque. Les fichiers lib.h et lib.cc sont la bibliothèque d'encapsuleur contenant les liaisons C. Ma bibliothèque C++ réside dans le sous-dossier cpp.

Au moment où je l'ai travail en utilisant la chaîne de commandes suivantes:

cd lib 
g++ -c lib.cc 
ar rcs libib.a lib.o 
cd .. 
gcc -Ilib -Llib main.c -lib -lstdc++ 

Cependant, comme vous pouvez voir l'étape de liaison de l'utilisateur doit inclure les bibliothèques C++ utilisées dans ma bibliothèque C++. Dans ce cas, libstdC++. So (ou libstdC++. A si -static est utilisé).

Je voudrais inclure toutes les bibliothèques C++ dans mon libib.a de telle sorte que l'utilisateur peut simplement utiliser la commande suivante pour la compilation:

gcc -Ilib -Llib main.c -lib 
+0

Vous devriez faire des bibliothèques partagées (pas statiques), voir ma réponse. –

Répondre

0

Sur Linux, les bibliothèques partagées peuvent être faites par d'autres également relier bibliothèques partagées à l'intérieur d'eux. Ainsi, vous pouvez

  1. compiler le code source (y compris le code d'emballage C) avec -fPIC dans *.pic.o fichiers
  2. Fusionner tous ces fichiers dans une bibliothèque partagée reliant les bibliothèques nécessaires, par exemple

    g++ -shared *.pic.o -o libmy.so -lQt -lrt -lstdc++

Ensuite, vous pouvez utiliser simplement votre libmy.so comme gcc main.o -L. -lmy et cela reliera les autres bibliothèques.

Regardez par exemple à Parma Polyhedra Library, il a un libppl_c.so en C entourant un libppl.so en C++. Utilisez ldd pour lister les bibliothèques dépendantes:

% ldd /usr/lib/x86_64-linux-gnu/libppl_c.so.4 
linux-vdso.so.1 => (0x00007fffa17cf000) 
libppl.so.9 => /usr/local/lib/libppl.so.9 (0x00007fcfec5f1000) 
libpwl.so.5 => /usr/local/lib/libpwl.so.5 (0x00007fcfec3ed000) 
libgmpxx.so.4 => /usr/lib/x86_64-linux-gnu/libgmpxx.so.4 (0x00007fcfec1c5000) 
libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fcfebf56000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fcfebc4f000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fcfeb9cc000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcfeb645000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fcfeb42f000) 
libgmp.so.3 => /usr/lib/libgmp.so.3 (0x00007fcfeb1d2000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fcfecf11000) 

C'est sur Debian/Sid/AMD64

Un conseil général est d'éviter de construire des bibliothèques statiques (en utilisant ar et éventuellement ranlib). Construire des bibliothèques partagées à la place.

Vous ne pouvez pas faire des choses équivalentes sur les bibliothèques statiques car une bibliothèque statique est simplement une séquence de fichiers objets, rien de plus. (il n'y a pas d'espace de métadonnées pour les informations de dépendance dont vous rêvez).

Questions connexes