Erreur de liaison «référence non définie» à propos de la bibliothèque statique boost lors de la compilation

J’essaie de comstackr mon projet C ++ sur Linux x64 avec les librairies boost 1.57.

Ce projet est compilé avec scons et je l’ai compilé avec succès sur mon Arch Linux, mais cette fois a échoué sur une machine Ubuntu.

J’ai ajouté l’indicateur -lboost_coroutine pour la liaison, mais l’erreur “référence non définie” existait toujours.

 /usr/bin/g++ -o build/gcc.release/app -pthread -g build/gcc.release/src/han/unity/rpcx.o -lpthread -lz -lboost_coroutine -lboost_context -lboost_date_time build/gcc.release/src/han/unity/rpcx.o: In function `atsortingbutes': /usr/local/include/boost/coroutine/atsortingbutes.hpp:31: undefined reference to `boost::coroutines::stack_traits::default_size()' 

J’ai remarqué que atsortingbuts.hpp est exactement l’un des fichiers d’en-tête Boost Coroutine. Et j’ai essayé avec nm d’augmenter les bibliothèques coroutines et cela ne semble pas poser de problème.

 nm /usr/local/lib/libboost_coroutine.a | grep "default_size" 0000000000000170 T _ZN5boost10coroutines12stack_traits12default_sizeEv 

J’ai cherché les raisons possibles de cette erreur et la plupart concernent l’ordre des indicateurs de l’éditeur de liens. Et dans ce cas, le fichier rpcx.o dépend de boost_coroutine, ce qui apparaît donc devant.

Quoi d’autre pourrait être les causes?

Après plusieurs heures d’effort, je l’ai finalement résolu.

Il s’agit de l’ancienne librairie boost (v1.55) qui existe toujours et qui possède des bibliothèques statiques portant le même nom que ma librairie boost installée manuellement (v1.57). L’éditeur de liens a trouvé les bibliothèques statiques v1.55 avant v1.57 et a donc utilisé ces bibliothèques pour la liaison. Cependant, dans l’ancienne version, la fonction boost::coroutines::stack_traits::default_size() n’est toujours pas introduite, ce qui empêche l’éditeur de liens de trouver l’emplacement correct de cette fonction et renvoie “undefind reference”.

Pour ceux qui trouvent ces questions lors de la recherche d’erreurs “référence non définie” lors de la compilation, plusieurs étapes concernant le débogage de ce type de problème m’ont été présentées, et j’ai écrit ici pour votre information.

  1. Vérifiez si la bibliothèque à laquelle vous avez lié existe dans /usr/lib/ ou /usr/local/lib/ , sinon, essayez de les installer en premier.

  2. Vérifiez si vous avez ajouté le drapeau de liaison correct pour vos bibliothèques référencées. Par exemple, si vous utilisez des bibliothèques boost_coroutine, veillez à append -lboost_coroutine lors de la liaison.

  3. Vérifiez si l’ordre de liaison des drapeaux est correct (pour gcc). Cela pourrait être la cause de la plupart des cas. Assurez-vous de mettre B devant A si B dépend de A.

  4. Vérifiez s’il existe différentes versions pour les mêmes bibliothèques.

J’espère que ceux-ci pourraient aider d’une certaine manière.