web-dev-qa-db-fra.com

référence indéfinie à boost :: system :: system_category () lors de la compilation

J'essaie de compiler un programme sur Ubuntu 11.10 qui utilise les bibliothèques Boost. Les bibliothèques 1.46-dev Boost du référentiel Ubuntu sont installées, mais je reçois une erreur lors de la compilation du programme.

undefined reference to boost::system::system_category()

Qu'est-ce que je fais mal?

97
user1049697

La bibliothèque boost que vous utilisez dépend de la bibliothèque boost_system. (Tous ne le font pas.)

En supposant que vous utilisiez gcc, essayez d’ajouter -lboost_system sur votre ligne de commande du compilateur afin de créer un lien avec cette bibliothèque.

154
hc_

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, un défaut de fonctionnalité dans la conception d'origine l'oblige à utiliser boost::system::generic_category() et boost::system::system_category() inutilement. La compilation avec l'indicateur -DBOOST_SYSTEM_NO_DEPRECATED Désactive ce code et permet à un certain nombre de programmes de compiler sans nécessiter -lboost_system (Ce lien est toujours nécessaire si vous utilisez explicitement certaines fonctionnalités de la bibliothèque).

À partir de Boost 1.66 et this commit , ce comportement est désormais le comportement par défaut. Par conséquent, 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, Qui permet une version du code en-tête uniquement. Cependant, ceci est déconseillé par Boost car cela peut casser certaines fonctionnalités.

55
Marc Glisse

L'erreur ci-dessus est une erreur de l'éditeur de liens ... l'éditeur de liens n 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 '-l boost_system' à vos indicateurs d'éditeur de liens, ce qui indique à l'éditeur de liens qu'il doit rechercher des symboles tels que boost::system::system_category() dans la bibliothèque libboost_system.so

Si vous avez main.cpp, soit:

g++ main.cpp -o main -lboost_system

OR

g++ -c -o main.o main.cpp
g++ main.o -lboost_system
15
user1055604

Une autre solution de contournement pour ceux qui n'ont pas besoin de l'intégralité du Shebang: utilisez le commutateur

-DBOOST_ERROR_CODE_HEADER_ONLY.

Si vous utilisez CMake, c'est add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY).

15
Vadim Berman

Lorsque vous utilisez CMAKE et find_package, assurez-vous qu'il est bien:

find_package(Boost COMPONENTS system ...)

et pas

find_package(boost COMPONENTS system ...)

Certaines personnes peuvent avoir perdu des heures pour cela ...

7
Kriegalex

J'ai le même problème:

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   \
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-1_47 -lboost_filesystem-mgw45-mt-1_47

D: /bfs_ENTW_deb/obj/test/main_filesystem.obj: main_filesystem.cpp :(. Text + 0x54): référence non définie à `boost :: system :: generic_category ()

La solution consistait à utiliser la version debug de system-lib:

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   \
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-d-1_47 -lboost_filesystem-mgw45-mt-1_47

Mais pourquoi?

6
volker

Quand j'ai eu ce problème, la cause était la commande des bibliothèques. Pour résoudre ce problème, j'ai mis libboost_system dernier:

g++ mingw/timer1.o -o mingw/timer1.exe  -L/usr/local/boost_1_61_0/stage/lib \
    -lboost_timer-mgw53-mt-1_61 \
    -lboost_chrono-mgw53-mt-1_61 \
    -lboost_system-mgw53-mt-1_61

C’était sur mingw avec gcc 5.3 et boost 1.61.0 avec un exemple simple de minuterie.

4
Min Zhang

dans mon cas, ajouter -lboost_system n'était pas suffisant, il ne pouvait toujours pas le trouver dans mon environnement de construction personnalisé. Je devais utiliser le conseil de Débarrassez-vous de "gcc -/usr/bin/ld: avertissement lib introuvable" et changez mon ./configure commande à:

./configure CXXFLAGS="-I$HOME/include" LDFLAGS="-L$HOME/lib -Wl,-rpath-link,$HOME/lib" --with-boost-libdir=$HOME/lib --prefix=$HOME

pour plus de détails, voir Boost 1.51: "erreur: impossible d'établir un lien avec boost_thread!"

2
jcomeau_ictx

... et au cas où vous souhaiteriez lier statiquement votre principal, ajoutez dans votre Jamfile ce qui suit aux exigences:

<link>static
<library>/boost/system//boost_system

et peut-être aussi:

<linkflags>-static-libgcc
<linkflags>-static-libstdc++
1
formiaczek