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
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
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
.
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.
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})
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 ...
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()
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
.
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.
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
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
g ++ -lboost_system -lboost_filesystem userentry.cpp -o userentry
a parfaitement fonctionné sous debian. (boost les bibliothèques c ++ installées avec apt-get).
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})