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?
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.
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.
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
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)
.
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 ...
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?
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.
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!"
... 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++