2009-09-16 3 views
3

J'essaie de créer un objet partagé (.so) qui le fera, en incluant un objet partagé avec -lboost, j'inclue implicitement tout le boost bibliothèques. Voici ce que j'ai essayé:Création d'un objet partagé fictif (.so) pour dépendre d'autres objets partagés

#!/bin/sh 
BOOST_LIBS="-lboost_date_time-gcc43-mt -lboost_filesystem-gcc43-mt" 
    #truncated for brevity 
g++ $BOOST_LIBS -shared -Wl,-soname,libboost.so.1 -o libboost.so.1.0 
ln -si libboost.so.1.0 libboost.so.1 
ln -si libboost.so.1 libboost.so 

Après avoir placé tous les 3 fichiers créés (libboost.so libboost.so.1 libboost.so.1.0) dans le même répertoire que toutes les bibliothèques Boost, j'ai essayé la compilation d'un programme de test avec (ce qui dépend de -lboost_date_time-gcc43-mt):

g++ -lboost test.cpp 

Faire cela, je me suis le même message de référence non définie ne pas avoir -lboost. Ayant -lboost_date_time-gcc43-mt works, mais c'est trop verbeux :) Comment obtenir -lboost pour faire entrer automatiquement les autres bibliothèques partagées?

+0

Mise à jour: Exécution d'objdump -x libboost.so | grep NÉCESSAIRE donne ceci: NÉCESSAIRE libboost_date_time-gcc43-mt-1_38.so.1.38.0 NÉCESSAIRE libboost_filesystem-gcc43-mt-1_38.so.1.38.0 NÉCESSAIRE /boot/develop/lib/x86/libstdc++.so NÉCESSAIRE libroot.donc (Notez que je cours Haiku) –

Répondre

1

Ce n'est pas le cas. Pas vraiment, de toute façon.

L'éditeur de liens supprime toutes les dépendances de symboles car le .so ne les utilise pas.

Vous pouvez contourner cela, peut-être, en écrivant un linker script qui déclare tous les symboles dont vous avez besoin en tant que dépendances EXTERN(). Mais cela implique que vous aurez besoin de lister tous les noms mutilés pour les symboles dont vous avez besoin. Pas du tout la peine de l'effort, OMI.

+0

Ah, donc je suppose que je devrais écrire du code qui référence chaque symbole dans les dépendances ou, plutôt, utiliser une approche sensée qui ne dépouille pas les dépendances? Ou est-ce que créer un mannequin est pratiquement impossible? –

+0

D'accord, merci. Je suppose que je vais juste mettre en place une variable d'environnement commode à placer lors de la construction: g ++ $ lboost alive.cpp –

+0

Si vous n'utilisez pas déjà Makefiles, vous devriez. Vous pouvez également envisager d'utiliser un outil de configuration automatique. Cela facilitera le développement des lots. – greyfade

1

Je n'ai pas de solution pour créer un '.so' factice, mais j'ai quelque chose qui va vous simplifier la vie ... Je vous suggère fortement d'essayer d'utiliser cross-platform make (CMake). En CMake, reliant contre ces bibliothèques est facile:

 
FIND_PACKAGE(Boost 1.37 COMPONENTS date_time filesystem REQUIRED) 
ADD_EXECUTABLE(myexecutable ${myexecutable_SRCS}) 
TARGET_LINK_LIBRARIES(myexecutable ${Boost_LIBRARIES}) 

Les commandes ci-dessus, si elles sont placées dans un fichier « CMakeLists.txt », est tout ce que vous devez:

  1. Vérifiez que Boost 1,37 ou plus tard est installé, avec les bibliothèques "date_time" et "filesystem" installées.
  2. Créez un fichier exécutable nommé "myexecutable" à partir des sources répertoriées dans la variable correspondante.
  3. Associez l'exécutable "myexecutable" aux bibliothèques boost "date_time" et "filesystem".

Voir également: Why the KDE project switched to CMake.

1

En fait, faire dépendre un .so de tous les fichiers boost .so est tout à fait possible (mais peut ne pas vous aider). Je viens d'essayer ceci:

$ export BOOST_ROOT=/home/ghost/Work/Boost/boost-svn 
$ g++ -shared -Wl,-soname,libboost.so -o libboost.so $BOOST_ROOT/stage/lib/libboost_program_options.so 
$ g++ -L . -I $BOOST_ROOT first.cpp -lboost -Wl,-R$BOOST_ROOT/stage/lib 
$ LD_LIBRARY_PATH=.:$BOOST_ROOT/stage/lib ./a.out 

Et cela a fonctionné. Cependant, notez que danser avec -R et LD_LIBRARY_PATH. Je ne sais pas comment vous pouvez inclure le chemin de Boost .so dans votre libboost.so afin qu'ils soient utilisés à la fois pour relier et exécuter l'application. Je peux inclure rpath dans libboost.so très bien, mais il est ignoré lors de la résolution de symboles pour l'application.

Questions connexes