C ++ Boost: niezdefiniowane odwołanie do boost :: system :: generic_category ()

92

Próbuję włączyć Boostbiblioteki 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.hppplikó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
Szyfr
źródło
jeśli nie łączysz go prawidłowo, bloki kodu nie zrobią tego za Ciebie w przeciwieństwie do ścieżki systemowej i repozytorium systemu,
pyCthon,
@pyCthon: W takim przypadku czy możesz dodać więcej szczegółów na temat tego, jak połączyć to w Code :: blocks. Próbowałem dodać flagę konsolidatora -lboost_systemw 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.
Szyfruj
więc jakiego kompilatora używasz? mingw? gcc? jaki kod próbujesz uruchomić? podaj przykład .....
pyCthon
@pyCthon: Comiler to Gcc. Do tej pory nie napisałem żadnego kodu, ale próbowałem włączyć Boost filesystem library(operation.hpp w powyższym poście)
Cipher
czy działa kompilowanie zwykłego programu z biblioteką systemu plików boost z wiersza poleceń za pomocą g ++?
pyCthon

Odpowiedzi:

141

Powinieneś linkować w libboost_systembibliotece. Nie jestem pewien co do bloków kodu, ale opcja wiersza poleceń g ++ na twojej platformie byłaby

-lboost_system

juanchopanza
źródło
Jednak już znalazłem flagę konsolidatora do dodania. Nie mogę go uruchomić w Codeblocks.
Szyfruj
@Cipher Czy możesz uzyskać polecenia kompilacji i łączenia wykonywane przez bloki kodu?
juanchopanza
@ Szyfruj przepraszam, pastebin jest zablokowany w pracy. Mogę sprawdzić później, ale zajmie to kilka godzin.
juanchopanza
Nie ma problemu. Zaktualizowany również w poście
Szyfruj
mam ten sam problem co Cipher, tylko w moim przypadku mam do czynienia z boost / asio.hpp. Otrzymuję ten błąd s1.directupload.net/images/130608/koyvqpdp.jpg podczas próby kompilacji. Kiedy próbuję dodać -lboost_system, pojawia się komunikat „nie można znaleźć lboost_system”. Jaki jest problem?
ddacot
21

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_systemnie można go znaleźć przez linker, spróbuj -lboost_system-mt.

tssch
źródło
1
Działa, ponieważ dla tych wersji przyspieszenia rzeczywista nazwa pliku biblioteki miała -mtsufiks.
tssch
9

To problem konsolidatora. Dołącz ścieżkę biblioteki statycznej do swojego projektu.

W programie Qt Creator otwórz plik projektu .proi dodaj następujący wiersz:

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

W moim przypadku Ubuntu x86_64:

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

W przypadku Codeblocks otwórz Settings->Compiler...->Linkerzakładkę ustawień i dodaj:

boost_system

do widżetu tekstowego Biblioteki linków i naciśnij OKprzycisk.

GLR
źródło
7

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})
SubMachine
źródło
5

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()
sdd
źródło
4

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 ...

Halowb
źródło
To rozwiązało mój problem. Bardzo łatwo jest zapomnieć o flagach używanych podczas kompilacji, szczególnie gdy używasz domyślnych.
Filipe Calasans
3

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_systemdo GCC C++ Linker->Libraries.

piotr93
źródło
1

Możesz napotkać inny problem. Po zainstalowaniu Boost na Linux Mint miałem ten sam problem. Łączenie -lboost_systemlub -lboost_system-mtnie 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.

nuduoz
źródło
1

Jeśli biblioteka nie jest zainstalowana, powinieneś podać folder bibliotek wspomagających:

przykład:

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

Majukarma
źródło
0

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 boost

użyj, find /usr/ -name '*boost*.so'aby znaleźć lokalizację biblioteki boost

algometrix
źródło
0

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

działał doskonale pod Debianem. (biblioteki boost c ++ zainstalowane z apt-get).

majukarma
źródło
0

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})

Alan Yang
źródło