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?
Utilisez également 'pkg-config --libs' au moment de la liaison –
@BasileStarynkevitch, je l'ai fait aussi. J'ai édité la question originale pour inclure cette information. –
Il semble que MBSim veut un chemin différent de '/ usr/local/mbsim-env' – Ripi2