Messages d'erreur

error: undefined symbol

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.

ld: error: ….a(…): requires dynamic R_X86_64_PC32 reloc against '…' which may overflow at runtime; recompile with -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

/usr/bin/ld: relocation R_X86_64_32 against '…' can not be used when making a shared object; recompile with -fPIC

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