101 votes

C++ Boost : référence indéfinie à boost::system::generic_category()

J'essaie d'inclure Boost dans mon projet et j'ai rencontré des problèmes dans ce domaine. Je suis sur Ubuntu 12.10 avec l'IDE Codeblocks et j'ai essayé d'installer les bibliothèques manuellement en lisant les instructions du site, mais j'ai eu des erreurs avec les en-têtes ainsi que les bibliothèques à construire avant utilisation.

J'ai ensuite installé les bibliothèques via le terminal en sudo apt-get install libboost-all-dev . Après cela, dans mes programmes sur Codeblocks, je peux inclure des en-têtes comme #include <boost/regex.hpp> mais lorsque j'essaie d'inclure l'en-tête de la bibliothèque Filesystem ( #include "boost/filesystem/operations.hpp" ), j'obtiens l'erreur suivante :

/usr/include/boost/system/error_code.hpp|214|undefined reference to boost::system::generic_category()'|

Je ne sais pas comment résoudre cette erreur (spécifiquement dans Codeblocks sous Linux). J'aurais vraiment besoin d'aide ici.

Compilateur : Gcc
Code du programme : Seulement essayé en incluant le système de fichiers ci-dessus. operations.hpp fichier.

Journal de construction de Codeblocks :

Build started on: 20-11-2012 at 18:02.53
Build ended on: 20-11-2012 at 18:02.54
-------------- Build: Debug in libopenFrameworks ---------------
Target is up to date.
-------------- Build: Debug in reader1 ---------------
make -s -f Makefile Debug
linking i686 bin/reader1_debug linux
obj/i686Debug/src/testApp.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
obj/i686Debug/src/main.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
collect2: ld returned 1 exit status
make: *** [bin/reader1_debug] Error 1
Process terminated with status 2 (0 minutes, 1 seconds)
6 errors, 0 warnings

152voto

juanchopanza Points 115680

Vous devez créer un lien dans le libboost_system bibliothèque. Je ne suis pas sûr pour les codeblocks, mais l'option de la ligne de commande g++ sur votre plateforme serait la suivante

-lboost_system

21voto

tssch Points 184

Selon la version de boost, libboost-system est livré avec le suffixe -mt qui devrait indiquer la capacité de multithreading des bibliothèques.

Donc si -lboost_system ne peut pas être trouvé par l'éditeur de liens, essayez -lboost_system-mt .

9voto

GLR Points 147

C'est un problème de linker. Incluez le chemin de la bibliothèque statique dans votre projet.

Pour Qt Creator, ouvrez le fichier du projet .pro et ajoutez la ligne suivante :

LIBS += -L<path for boost libraries in the system> -lboost_system

Dans mon cas, Ubuntu x86_64 :

LIBS += -L/usr/lib/x86_64-linux-gnu -lboost_system

Pour les Codeblocks, ouvrez Settings->Compiler...->Linker l'onglet "Paramètres" et ajouter :

boost_system

dans le widget de texte "bibliothèques de liens" et appuyez sur OK bouton.

9voto

sdd Points 40

Ce site réponse a en fait aidé en utilisant Boost et cmake.

Ajout de add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY) pour le fichier cmake.

Mon CMakeLists.txt ressemble à ceci :

cmake_minimum_required(VERSION 3.12)
project(proj)

set(CMAKE_CXX_STANDARD 17)

set(SHARED_DIR "${CMAKE_SOURCE_DIR}/../shared")

set(BOOST_LATEST_DIR            "${SHARED_DIR}/boost_1_68_0")
set(BOOST_LATEST_BIN_DIR        "${BOOST_LATEST_DIR}/stage/lib")
set(BOOST_LATEST_INCLUDE_DIR    "${BOOST_LATEST_DIR}/boost")
set(BOOST_SYSTEM                "${BOOST_LATEST_BIN_DIR}/libboost_system.so")
set(BOOST_FS                    "${BOOST_LATEST_BIN_DIR}/libboost_filesystem.so")
set(BOOST_THREAD                "${BOOST_LATEST_BIN_DIR}/libboost_thread.so")

set(HYRISE_SQL_PARSER_DIR           "${SHARED_DIR}/hyrise_sql_parser")
set(HYRISE_SQL_PARSER_BIN_DIR       "${HYRISE_SQL_PARSER_DIR}")
set(HYRISE_SQL_PARSER_INCLUDE_DIR   "${HYRISE_SQL_PARSER_DIR}/src")
set(HYRISE_SQLPARSER                "${HYRISE_SQL_PARSER_BIN_DIR}/libsqlparser.so")

include_directories(${CMAKE_SOURCE_DIR} ${BOOST_LATEST_INCLUDE_DIR} ${HYRISE_SQL_PARSER_INCLUDE_DIR})

set(BOOST_LIBRARYDIR "/usr/lib/x86_64-linux-gnu/")
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)

add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)

find_package(Boost 1.68.0 REQUIRED COMPONENTS system thread filesystem)

add_executable(proj main.cpp row/row.cpp row/row.h table/table.cpp table/table.h page/page.cpp page/page.h
        processor/processor.cpp processor/processor.h engine_instance.cpp engine_instance.h utils.h
        meta_command.h terminal/terminal.cpp terminal/terminal.h)

if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    target_link_libraries(proj PUBLIC Boost::system Boost::filesystem Boost::thread ${HYRISE_SQLPARSER})
endif()

8voto

SubMachine Points 67

J'ai également cherché une solution, et aucune des réponses que j'ai rencontrées ne résolvait l'erreur, jusqu'à ce que je trouve la réponse de "ViRuSTriNiTy" à ce fil de discussion : Référence indéfinie à 'boost::system::generic_category()' ?

Selon cette réponse, essayez d'ajouter ces lignes à votre fichier cmake :

find_package(Boost 1.55.0 REQUIRED COMPONENTS system filesystem)
include_directories(... ${Boost_INCLUDE_DIRS})
link_directories(... ${Boost_LIBRARY_DIRS})
target_link_libraries(... ${Boost_LIBRARIES})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X