Le premier point est de vérifier existe dans l'une des librairies ou fichiers objets que l'on souhaiter regrouper. Voir nm.
Si les symboles sont bien existants, il faut vérifier que l'ordre de liaison est le bon. Par exemple, avec le message d'erreur :
ld.lld: error: undefined symbol: Magnum::GL::Context::tryCreate() >>> referenced by GLContext.h:151 (...\Magnum/Platform\GLContext.h:151) >>> .../file.cpp.o:(Magnum::Platform::GLContext::tryCreate())
Il faut essayer d'inverser l'ordre du fichier file.cpp.o
et libMagnumGL.a
(qui contient le symbole Magnum::GL::Context::tryCreate()
).
En 64 bit, pour fusionner les librairies statiques vers des librairies dynamiques, il est nécessaire d'activer la fonctionnalité -fPIC
.
C'est dû à un problème dans l'ordre des fichiers objets et des librairies statique.
Problème :
/usr/bin/c++ -fPIC -shared -Wl,-soname,lib2lgc.so -o lib2lgc.so CMakeFiles/2lgc.dir/2lgc/math/compare_decimal.cc.o CMakeFiles/2lgc.dir/2lgc/poco/number.cc.o CMakeFiles/2lgc.dir/2lgc/poco/number_visitor_unit.cc.o CMakeFiles/2lgc.dir/2lgc/poco/number_visitor_value.cc.o 2lgc/poco/lib2lgcpoco.a
Solution :
/usr/bin/c++ -fPIC -shared -Wl,-soname,lib2lgc.so -o lib2lgc.so 2lgc/poco/lib2lgcpoco.a CMakeFiles/2lgc.dir/2lgc/math/compare_decimal.cc.o CMakeFiles/2lgc.dir/2lgc/poco/number.cc.o CMakeFiles/2lgc.dir/2lgc/poco/number_visitor_unit.cc.o CMakeFiles/2lgc.dir/2lgc/poco/number_visitor_value.cc.o
Dans un environnement 64 bits, il n'est pas possible d'utiliser des librairies statiques pour générer une librairie dynamique si les librairies statiques n'ont pas été compilées avec -fPIC
.
Position Independent Code and x86-64 libraries Archive du 05/01/2013 le 24/01/2023