2017-09-27 1 views
1

J'essaie de lier un programme C++ qui utilise plusieurs bibliothèques partagées de tierces parties. Principalement, ces bibliothèques proviennent d'un projet github appelé MBSim et j'ai téléchargé la dernière version quotidienne avec tous ses binaires, bibliothèques et en-têtes, que j'ai installés sur /usr/local/mbsim-env.g ++ erreur de référence non définie lors de la liaison à des bibliothèques partagées par des tiers

Les bibliothèques les plus importantes sont appelées libmbsim, libopenmbvcppinterface, libfmatvec et libboost_filesystem (le dernier est livré avec la distro MBSim).

Je mis en place un code simple à tester et il compile comme un charme en utilisant

g++ main.cpp -m64 -g3 -std=c++11 -Wall 
       -Wfatal-errors -Werror -Wno-unknown-pragmas -fopenmp 
       `pkg-config --cflags mbsim` -I. -c -o main.o 

Les pkg-config appels partie, comme vous pouvez le demander, les inclure les répertoires et drapeaux:

-DHAVE_ANSICSIGNAL -DHAVE_OPENMBVCPPINTERFACE -DHAVE_BOOST_FILE_LOCK 
    -I/usr/local/mbsim-env/include 
    -I/usr/include/x86_64-linux-gnu 
    -I/usr/include/x86_64-linux-gnu/c++/5 
    -I/usr/local/include 

Mes problèmes apparaissent lorsque j'essaie de lier les objets avec les bibliothèques précompilées avec:

g++ system.o main.o -o teste -L/usr/local/mbsim-env/lib 
        -lmbsim -lopenmbvcppinterface -lboost_system 
        -lfmatvec -lm 
        -Wl,-rpath,/usr/local/mbsim-env/lib 

Modifier: Sur la commande ci-dessus, j'ai également essayé d'utiliser pkg-config --libs. Les résultats restent les mêmes.

Tout d'abord, l'éditeur de liens émet un avertissement que je relie à une bibliothèque boost ancienne:

/usr/bin/ld: warning: libboost_system.so.1.53.0, 
       needed by /usr/local/mbsim-env/lib/libmbsim.so, 
       may conflict with libboost_system.so.1.61.0 

Je suis au courant de cela, mais je veux intentionnellement un lien contre l'ancien parce que c'est celui qui a été utilisé pour compiler les bibliothèques MBSim.

Après cela, je me suis plusieurs undefined reference avertissements pour presque toutes les méthodes que j'appelle de MBSim:

system.cpp:59: undefined reference to 
     MBSim::RigidBody::RigidBody(std::__cxx11::basic_string<char, 
     std::char_traits<char>, std::allocator<char> > const&)' 

Il me semble que cette erreur signifie que les bibliothèques cibles ne sont pas la méthode RigidBody mis en œuvre. Eh bien, je sais qu'ils le font. Ma première supposition était que peut-être l'éditeur de liens regardait le mauvais chemin de la bibliothèque, donc j'ai mis LD_LIBRARY_PATH=/usr/local/mbsim-env/lib et ajouté le -rpath dans le même dossier. Cela n'a pas aidé du tout.

Une recherche de google m'a montré que le problème pourrait être de compiler en 64bits et de le relier à 32bits. Je crois que ce n'est pas le cas: j'ai tout fait dans Ubuntu 16.04 64bits et les librairies MBSim sont aussi 64bits.

Quelqu'un pourrait-il me pointer hors de cette impasse?

+0

Utilisez également 'pkg-config --libs' au moment de la liaison –

+0

@BasileStarynkevitch, je l'ai fait aussi. J'ai édité la question originale pour inclure cette information. –

+0

Il semble que MBSim veut un chemin différent de '/ usr/local/mbsim-env' – Ripi2

Répondre

1

Se pourrait-il que vos bibliothèques partagées par des tiers soient compilées en utilisant une ancienne version de GCC? Un nouvel ABI a été introduit dans GCC 5. Il est probablement activé par défaut sur votre plate-forme. Voir https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html.

Vous pouvez essayer de basculer vers l'ancienne ABI, mais cela peut nécessiter que vos autres bibliothèques aient été compilées avec l'ancienne ABI. Vous pouvez également activer les ABI pour les bibliothèques tierces de manière explicite.

+0

Merci, @ any1, qui a résolu le problème. J'ai ajouté '-D_GCLIBXX_USE_CXX11_ABI = 0' à ma commande de compilation et les références non définies aux méthodes' std :: __ cxx11 :: basic_string' ont disparu. –

0

référence non définie à MBSim::RigidBody::RigidBody(std::__cxx11::basic_string<std::char_traits<char>, std::allocator<char> > const&)

Ceci est une référence à MBSim::RigidBody::RigidBody(const string&), compilé avec g++ -std=c++11 et g++ version 5 ou ultérieure.

Comme any1 probablement deviné correctement, le binaire pour libmbsim.so que vous avez téléchargé a été construit avec g ++ 4.x et définit la même fonction avec cette signature:

MBSim::RigidBody::RigidBody(std::basic_string<char, std::char_traits<char>, 
               std::allocator<char> > const&) 

manque Note de __cxx11 espace de noms. Vous pouvez facilement confirmer ou d'infirmer ceci:

nm -C libmbsim.so | grep 'MBSim::RigidBody::RigidBody' 

Si ce décalage est en effet la cause, la reconstruction simplement ce projet de la source avec votre compilateur. C'est ce que l'open source est pour.