Próbuję włączyć Boost
biblioteki do mojego projektu i napotykam problemy w tym samym. Korzystam z Ubuntu 12.10 z Codeblocks IDE i próbowałem zainstalować biblioteki ręcznie, odczytując instrukcje z witryny, ale otrzymywałem błędy z nagłówkiem, a także bibliotekami do zbudowania przed użyciem.
Następnie zainstalowałem biblioteki przez terminalby sudo apt-get install libboost-all-dev
. Następnie w moich programach w Codeblocks mogę dołączać nagłówki, takie jak, #include <boost/regex.hpp>
ale kiedy próbuję dołączyć nagłówek dla biblioteki Filesystem ( #include "boost/filesystem/operations.hpp"
), pojawia się następujący błąd:
/usr/include/boost/system/error_code.hpp|214|undefined reference to boost::system::generic_category()'|
Nie jestem pewien, jak rozwiązać ten błąd (szczególnie w Codeblocks w systemie Linux). Naprawdę przydałaby mi się pomoc.
Kompilator: Gcc
Kod programu: próbowano tylko włączyć powyższy plik systemu operations.hpp
plików.
Zbuduj dziennik z 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
źródło
-lboost_system
w jakimś miejscu w ustawieniach, ale to nie rozwiązało. Jednak nie jestem nawet pewien, czy wykonałem całą rzecz związaną z flagą linkera we właściwym miejscu. Trochę więcej szczegółów byłoby bardzo pomocne.Boost filesystem library
(operation.hpp w powyższym poście)Odpowiedzi:
Powinieneś linkować w
libboost_system
bibliotece. Nie jestem pewien co do bloków kodu, ale opcja wiersza poleceń g ++ na twojej platformie byłabyźródło
W zależności od wersji boost, libboost-system ma przyrostek -mt, który powinien wskazywać na możliwości wielowątkowości bibliotek.
Więc jeśli
-lboost_system
nie można go znaleźć przez linker, spróbuj-lboost_system-mt
.źródło
-mt
sufiks.To problem konsolidatora. Dołącz ścieżkę biblioteki statycznej do swojego projektu.
W programie Qt Creator otwórz plik projektu
.pro
i dodaj następujący wiersz:LIBS += -L<path for boost libraries in the system> -lboost_system
W moim przypadku Ubuntu x86_64:
W przypadku Codeblocks otwórz
Settings->Compiler...->Linker
zakładkę ustawień i dodaj:do widżetu tekstowego Biblioteki linków i naciśnij OKprzycisk.
źródło
Szukałem również rozwiązania i żadna z napotkanych odpowiedzi nie rozwiązała błędu. Dopóki nie znalazłem odpowiedzi „ViRuSTriNiTy” w tym wątku: Niezdefiniowane odniesienie do „boost :: system :: generic_category ()”?
zgodnie z tą odpowiedzią spróbuj dodać te linie do swojego pliku 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})
źródło
Ta odpowiedź faktycznie pomogła podczas korzystania z Boost i cmake.
Dodawanie
add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
do pliku cmake.Mój CMakeLists.txt wygląda następująco:
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()
źródło
Ten sam problem przy tworzeniu prostego przykładu przyspieszenia, rozwiązany po zmianie flagi kompilatora g ++ z -std = c ++ 14 na -std = c ++ 11 .
I zauważyłem, że jest to przykład w C ++ 11 ...
źródło
Miałem ten sam problem i również używam Linux Mint (jako nuduoz). Mój problem ze sprawą został rozwiązany po dodaniu
boost_system
doGCC C++ Linker->Libraries
.źródło
Możesz napotkać inny problem. Po zainstalowaniu Boost na Linux Mint miałem ten sam problem. Łączenie
-lboost_system
lub-lboost_system-mt
nie zadziałało, ponieważ biblioteka ma nazwęlibboost_system.so.1.54.0
.Więc rozwiązaniem jest utworzenie dowiązania symbolicznego do oryginalnego pliku. W moim przypadku
sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_system.so.1.54.0 /usr/lib/libboost_system.so
Aby uzyskać więcej informacji, zobacz to pytanie.
źródło
Jeśli biblioteka nie jest zainstalowana, powinieneś podać folder bibliotek wspomagających:
przykład:
źródło
próbować
g++ -c main.cpp && g++ main.o /usr/lib/x86_64-linux-gnu/libboost_system.so && ./a.out
/usr/lib/x86_64-linux-gnu/
to lokalizacja biblioteki boostużyj,
find /usr/ -name '*boost*.so'
aby znaleźć lokalizację biblioteki boostźródło
działał doskonale pod Debianem. (biblioteki boost c ++ zainstalowane z apt-get).
źródło
Po przetestowaniu opisanych powyżej proponowanych rozwiązań stwierdziłem, że tylko te kilka linii będzie działać.
Używam Ubuntu 16.04.
Projekt cmake_minimum_required (WERSJA 3.13)
(myProject)
set (CMAKE_CXX_STANDARD 11)
add_executable (myProject main.cpp)
find_package (Boost 1.58.0 System plików WYMAGANYCH KOMPONENTÓW)
target_link_libraries (myProject $ {Boost_LIBRARIES})
źródło