Prochaine révision | Révision précédente |
probleme:liaison [2018/03/18 03:16] – Création avec "requires dynamic R_X86_64_PC32 reloc against" root | probleme:liaison [2023/04/03 11:58] (Version actuelle) – Ajout de "error: undefined symbol" root |
---|
====ld: error: ….a(…): requires dynamic R_X86_64_PC32 reloc against '…' which may overflow at runtime; recompile with -fPIC==== | ====Messages d'erreur==== |
| |
| ===error: undefined symbol=== |
| |
| * Est-ce que le symbole existe ? |
| |
| Le premier point est de vérifier existe dans l'une des librairies ou fichiers objets que l'on souhaiter regrouper. Voir [[debug:librairie#recuperer_la_liste_des_symboles_dans_une_librairie|nm]]. |
| |
| * Est-ce que l'ordre de liaison est le bon ? |
| |
| 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 : |
| |
| <code> |
| 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()) |
| </code> |
| |
| Il faut essayer d'inverser l'ordre du fichier ''file.cpp.o'' et ''libMagnumGL.a'' (qui contient le symbole ''Magnum::GL::Context::tryCreate()''). |
| |
| * Mélange de librairies dynamiques et statiques ? |
| |
| 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. | C'est dû à un problème dans l'ordre des fichiers objets et des librairies statique. |
| |
Solution : | 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/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''. |
| |
| [[https://www.technovelty.org/c/position-independent-code-and-x86-64-libraries.html|Position Independent Code and x86-64 libraries]] {{ :probleme:liaison:position_independent_code_and_x86-64_libraries_24_01_2023_10_56_48_.html |Archive du 05/01/2013 le 24/01/2023}} |
| |
| |