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

92

J'essaie d'inclure des Boostbibliothèques dans mon projet et j'ai été confronté à des problèmes. 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 les 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 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 (en particulier dans Codeblocks sous Linux). Je pourrais vraiment avoir besoin d'aide ici.

Compilateur:
Code du programme Gcc: seulement essayé d'inclure le fichier système de operations.hppfichiers ci-dessus .

Créer un journal à partir 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
Chiffrer
la source
vous ne le liez pas correctement, les blocs de code ne le feront pas pour vous contrairement à votre chemin système et à votre référentiel système,
pyCthon
@pyCthon: Dans ce cas, pouvez-vous ajouter plus de détails sur la façon de lier ceci dans Code :: blocks. J'ai essayé d'ajouter le drapeau de l'éditeur de liens -lboost_systemà un endroit dans les paramètres, mais cela n'a pas été résolu. Cependant, je ne suis même pas sûr d'avoir fait tout le truc du drapeau de l'éditeur de liens au bon endroit. Un peu plus de détails serait d'une grande aide.
Chiffre
bien quel compilateur utilisez-vous? mingw? gcc? quel code essayez-vous d'exécuter? donner un exemple .....
pyCthon
@pyCthon: Comiler est Gcc. Je n'ai écrit aucun code jusqu'à présent, mais j'ai essayé d'inclure le Boost filesystem library(operation.hpp dans le post ci-dessus)
Chiffre
fonctionne-t-il compiler un programme régulier avec la bibliothèque de système de fichiers boost à partir de la ligne de commande avec g ++?
pyCthon

Réponses:

141

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

-lboost_system

juanchopanza
la source
J'ai déjà trouvé le drapeau de l'éditeur de liens à ajouter. Impossible de le faire fonctionner dans Codeblocks.
Chiffre
@Cipher pouvez-vous obtenir les commandes de construction et de liaison exécutées par des blocs de code?
juanchopanza
@Cipher désolé, pastebin est bloqué au travail. Je peux vérifier plus tard mais cela prendra quelques heures.
juanchopanza
Aucun problème. Mis à jour également dans le post
Chiffre
J'ai le même problème que Cipher, juste dans mon cas, je traite avec boost / asio.hpp. J'obtiens ces erreurs s1.directupload.net/images/130608/koyvqpdp.jpg en essayant de compilateur. Quand j'essaye d'ajouter -lboost_system il dit "ne peut pas trouver lboost_system". Quel est le problème?
ddacot
21

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

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

tssch
la source
1
Cela fonctionne car pour ces versions boostées, le nom réel du fichier de bibliothèque avait un -mtsuffixe.
tssch le
9

C'est un problème d'éditeur de liens. Incluez le chemin de la bibliothèque statique dans votre projet.

Pour Qt Creator, ouvrez le fichier projet .proet 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 blocs de code, ouvrez l' Settings->Compiler...->Linkeronglet Paramètres et ajoutez:

boost_system

au widget de texte Lier les bibliothèques et appuyez sur le OKbouton.

GLR
la source
7

J'ai également 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: Référence non dé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})
Sous-machine
la source
5

Cette réponse a en fait aidé lors de l'utilisation de Boost et cmake.

Ajout 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()
sdd
la source
4

Même problème lors de la construction d'un exemple de boost simple, résolu après avoir changé l'indicateur du compilateur g ++ de -std = c ++ 14 à -std = c ++ 11 .

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

Halowb
la source
Cela a résolu mon problème. Il est assez facile d'oublier les indicateurs utilisés lors de la compilation, en particulier lorsque vous utilisez ceux par défaut.
Filipe Calasans
3

J'ai eu le même problème et j'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.

piotr93
la source
1

Vous pourriez rencontrer un autre problème. Après avoir installé Boost sur Linux Mint, j'ai eu le même problème. Lien -lboost_systemou -lboost_system-mtn'a pas fonctionné parce que la bibliothèque a eu un nom libboost_system.so.1.54.0.

La solution est donc de 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, consultez cette question.

nuduoz
la source
1

Si la bibliothèque n'est pas installée, vous devez donner le dossier des bibliothèques boost:

exemple:

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

Majukarma
la source
0

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

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

algométrix
la source
0

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

fonctionnait parfaitement sous debian. (Boostez les bibliothèques C ++ installées avec apt-get).

majukarma
la source
0

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

J'utilise Ubuntu 16.04.

projet cmake_minimum_required (VERSION 3.13)
(monProjet)

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

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

Alan Yang
la source