web-dev-qa-db-fra.com

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

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

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

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

Je ne suis pas sûr de savoir comment résoudre cette erreur (en particulier dans Codeblocks sur Linux). Je pourrais vraiment utiliser de l'aide ici.

Compilateur: Gcc
Code du programme: Uniquement essayé, y compris le fichier operations.hpp du système de fichiers ci-dessus.

Construire le journal 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
75
Cipher

Vous devriez créer un lien dans la bibliothèque libboost_system. Je ne suis pas sûr de codeblocks, mais l'option de ligne de commande g ++ sur votre plate-forme serait

-lboost_system

127
juanchopanza

Selon la version de boost, libboost-system est fourni avec le suffixe -mt qui indique la capacité de lecture multiple des bibliothèques.

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

20
tssch

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

Pour Qt Creator, ouvrez le fichier de 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 Codeblocks, ouvrez l’onglet Settings->Compiler...->Linker et ajoutez:

boost_system

au widget de texte Bibliothèques de liens et appuyez sur OK bouton.

8
GLR

J'ai aussi cherché une solution et aucune des réponses que j'ai rencontrées n'a résolu l'erreur. Jusqu'à ce que je trouve la réponse de "ViRuSTriNiTy" à ce fil de discussion: Référence non définie à 'boost :: system :: generic_category ()'?

en fonction de 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})
7
SubMachine

Même problème lors de la construction d’un exemple simple de renforcement, résolu après que j’ai changé le drapeau du compilateur g ++ de -std = c ++ 14 en -std = c ++ 11 .

Et j'ai remarqué que c'est un exemple C++ 11 ...

2
Halowb

Cette réponse a réellement aidé à utiliser 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()
2
sdd

J'ai eu le même problème et utilise également Linux Mint (comme nuduoz). Mon problème de cas a été résolu après avoir ajouté boost_system à GCC C++ Linker->Libraries

1
piotr93

Vous pourriez rencontrer un autre problème. Après avoir installé Boost sur Linux Mint, j'ai eu le même problème. La liaison -lboost_system ou -lboost_system-mt n'a pas fonctionné car la bibliothèque porte le nom libboost_system.so.1.54.0 

La solution consiste donc à créer un lien symbolique vers le fichier d'origine. Dans mon cas

Sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_system.so.1.54.0 /usr/lib/libboost_system.so

Pour plus d'informations, voir this question.

1
nuduoz

essayer 

g++ -c main.cpp && g++ main.o /usr/lib/x86_64-linux-gnu/libboost_system.so && ./a.out 

/usr/lib/x86_64-linux-gnu/ est l'emplacement de la bibliothèque boost

utilisez find /usr/ -name '*boost*.so' pour trouver l'emplacement de la bibliothèque boost

0
algometrix

Si la bibliothèque n’est pas installée, vous devriez donner le dossier boost libraries:

exemple:

g ++ -L/usr/lib/x86_64-linux-gnu -lboost_system -lboost_filesystem prog.cpp -o prog

0
Majukarma

g ++ -lboost_system -lboost_filesystem userentry.cpp -o userentry

a parfaitement fonctionné sous debian. (boost les bibliothèques c ++ installées avec apt-get).

0
majukarma

Après avoir testé les solutions proposées décrites ci-dessus, j'ai constaté que seules ces quelques lignes pouvaient fonctionner.

J'utilise Ubuntu 16.04.

cmake_minimum_required (VERSION 3.13)
projet (monProjet)

set (CMAKE_CXX_STANDARD 11)
add_executable (myProject main.cpp)

find_package (système de fichiers système Boost 1.58.0 COMPOSANTS REQUIS)
target_link_libraries (myProject $ {Boost_LIBRARIES})

0
Alan Yang