J'essaye de compiler un programme sur Ubuntu 11.10 qui utilise les bibliothèques Boost. Les bibliothèques Boost 1.46-dev du référentiel Ubuntu sont installées, mais j'obtiens une erreur lors de la compilation du programme.
undefined reference to boost::system::system_category()
Qu'est-ce que je fais de mal?
Réponses:
La bibliothèque boost que vous utilisez dépend de la bibliothèque boost_system. (Tous ne le font pas.)
En supposant que vous utilisez gcc, essayez d'ajouter
-lboost_system
à la ligne de commande de votre compilateur afin d'établir un lien avec cette bibliothèque.la source
-lboost_system
, il ressemblait à ceci:sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system
. Cela n'a pas aidé cependant ...autoreconf
après? En outre, cet article et celui-ci pourraient vous aider dans la configuration de vos autotools.sslsniff_LDFLAGS
parsslsniff_LDADD
Makefile.am et cela n'a PAS fonctionné. Ensuite, j'ai gardé les deuxsslsniff_LDFLAGS
et ajoutésslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp
. Ensuite, j'ai pu compiler. Merci pour l'aide!La liaison avec une bibliothèque qui définit le symbole manquant (
-lboost_system
) est la solution évidente, mais dans le cas particulier de Boost.System, une anomalie dans la conception originale le rend utileboost::system::generic_category()
etboost::system::system_category()
inutile. Compiler avec l'indicateur-DBOOST_SYSTEM_NO_DEPRECATED
désactive ce code et permet à un certain nombre de programmes de se compiler sans exiger-lboost_system
(ce lien est bien sûr toujours nécessaire si vous utilisez explicitement certaines des fonctionnalités de la bibliothèque).À partir de Boost 1.66 et de ce commit , ce comportement est maintenant la valeur par défaut, donc j'espère que de moins en moins d'utilisateurs devraient avoir besoin de cette réponse.
Comme l'a remarqué @AndrewMarshall, une alternative consiste à définir
BOOST_ERROR_CODE_HEADER_ONLY
ce qui active une version du code en en-tête uniquement. Cela a été découragé par Boost car cela peut casser certaines fonctionnalités. Cependant, depuis 1.69, l'en-tête seul semble être devenu la valeur par défaut , ce qui rend cette question obsolète.la source
BOOST_ERROR_CODE_HEADER_ONLY
.Une autre solution de contournement pour ceux qui n'ont pas besoin de tout le shebang: utilisez le commutateur
-DBOOST_ERROR_CODE_HEADER_ONLY
.Si vous utilisez CMake, c'est
add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
.la source
L'erreur ci-dessus est une erreur de l'éditeur de liens ... l'éditeur de liens est un programme qui prend un ou plusieurs objets générés par un compilateur et les combine en un seul programme exécutable.
Vous devez ajouter des
-lboost_system
indicateurs de l'éditeur de liens qui indiquent à l'éditeur de liens qu'il doit rechercher des symboles commeboost::system::system_category()
dans la bibliothèquelibboost_system.so
.Si vous avez main.cpp, soit:
OU
la source
Lorsque vous utilisez CMAKE et find_package, assurez-vous que c'est:
et pas
Certaines personnes ont peut-être perdu des heures pour ça ...
la source
J'ai le même problème:
La solution était d'utiliser la version debug de la bibliothèque système:
Mais pourquoi?
la source
Quand j'ai eu ce problème, la cause était la commande des bibliothèques. Pour y remédier, j'ai mis en
libboost_system
dernier:C'était sur mingw avec gcc 5.3 et boost 1.61.0 avec un simple exemple de minuterie.
la source
dans mon cas, l'ajout
-lboost_system
n'était pas suffisant, il ne pouvait toujours pas le trouver dans mon environnement de construction personnalisé. J'ai dû utiliser les conseils de Débarrassez-vous de "gcc - / usr / bin / ld: warning lib not found" et changez ma./configure
commande en:pour plus de détails, voir Boost 1.51: "erreur: impossible de se lier à boost_thread!"
la source
... et au cas où vous voudriez lier votre main de manière statique, dans votre Jamfile ajoutez ce qui suit aux exigences:
et peut-être aussi:
la source