C ++ Boost : boost :: system :: generic_category ()에 대한 정의되지 않은 참조


92

Boost내 프로젝트에 라이브러리 를 포함 시키려고 노력 중이며 같은 문제에 직면 해 있습니다. Codeblocks IDE가있는 Ubuntu 12.10에 있으며 사이트에서 지침을 수동으로 읽고 라이브러리를 설치하려고 시도했지만 헤더 및 사용하기 전에 빌드 할 라이브러리에 오류가 발생했습니다.

그런 다음 terminalby를 통해 라이브러리를 설치했습니다 sudo apt-get install libboost-all-dev. 그 후 Codeblocks의 프로그램에서 다음과 같은 헤더를 포함 할 수 #include <boost/regex.hpp>있지만 파일 시스템 라이브러리 ( #include "boost/filesystem/operations.hpp" )에 대한 헤더를 포함하려고 하면 다음 오류가 발생합니다.

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

이 오류를 해결하는 방법을 모르겠습니다 (특히 Linux의 Codeblocks에서). 여기에 도움이 필요합니다.

컴파일러 : Gcc
프로그램 코드 : 위의 파일 시스템 operations.hpp파일 만 포함 해 보았습니다 .

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

제대로 연결하지 않으면
코드 블록

@pyCthon :이 경우 Code :: blocks에 링크하는 방법에 대한 자세한 내용을 추가 할 수 있습니다. -lboost_system설정의 일부 위치에 링커 플래그 를 추가하려고했지만 해결되지 않았습니다. 그러나 링커 플래그 전체를 올바른 위치에서 수행했는지조차 확실하지 않습니다. 좀 더 자세히 설명하면 큰 도움이 될 것입니다.
Cipher

어떤 컴파일러를 사용하고 있습니까? mingw? gcc? 실행하려는 코드는 무엇입니까? 예를 들어 .......
pyCthon

@pyCthon : Comiler는 Gcc입니다. 나는 지금까지 어떤 코드도 작성하지 않았지만 Boost filesystem library(위 게시물의 operation.hpp)를 포함 해 보았습니다.
Cipher

g ++로 명령 줄에서 boost 파일 시스템 라이브러리를 사용하여 일반 프로그램을 컴파일 할 수 있습니까?
pyCthon

답변:


142

libboost_system도서관 에서 링크해야합니다 . 코드 블록에 대해 잘 모르겠지만 플랫폼의 g ++ 명령 줄 옵션은 다음과 같습니다.

-lboost_system


이미 추가 할 링커 플래그를 찾았습니다. Codeblocks에서 작동하도록 할 수 없습니다.
Cipher

@Cipher 코드 블록에 의해 실행되는 빌드 및 링크 명령을 얻을 수 있습니까?
juanchopanza 2012

@Cipher 죄송합니다. pastebin이 직장에서 차단되었습니다. 나중에 확인할 수 있지만 몇 시간이 걸립니다.
juanchopanza 2012

문제 없어요. 게시물에서도 업데이트 됨
Cipher

나는 Cipher와 동일한 문제가 있습니다. 제 경우에는 boost / asio.hpp를 처리합니다. 컴파일러를 시도 할 때 s1.directupload.net/images/130608/koyvqpdp.jpg 오류가 발생 합니다. -lboost_system을 추가하려고하면 "lboost_system을 찾을 수 없습니다"라는 메시지가 표시됩니다. 뭐가 문제 야?
ddacot 2013 년

21

부스트 버전에 따라 libboost-system은 라이브러리 멀티 스레딩 기능을 나타내는 -mt 접미사와 함께 제공됩니다.

따라서 -lboost_system링커에서 찾을 수없는 경우 시도하십시오 -lboost_system-mt.


1
이러한 부스트 버전의 경우 실제 라이브러리 파일 이름에 -mt접미사 가 있기 때문에 작동합니다 .
tssch

9

링커 문제입니다. 프로젝트에 정적 라이브러리 경로를 포함합니다.

Qt Creator의 경우 프로젝트 파일을 열고 .pro다음 줄을 추가합니다.

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

제 경우에는 Ubuntu x86_64 :

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

Codeblocks의 경우 Settings->Compiler...->Linker설정 탭을 열고 다음을 추가하십시오.

boost_system

링크 라이브러리 텍스트 위젯으로 이동하고 OK버튼을 누릅니다.


7

나는 또한 해결책을 찾았고 내가 만난 대답 중 어느 것도 오류를 해결하지 못했습니다.이 스레드에 대한 "ViRuSTriNiTy"의 대답을 찾을 때까지 : 'boost :: system :: generic_category ()'에 대한 정의되지 않은 참조?

그 대답에 따라 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})

5

답변은 실제로 Boost 및 cmake를 사용할 때 도움 이 되었습니다.

add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)cmake 파일에 추가 .

내 CMakeLists.txt는 다음과 같습니다.

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

4

g ++ 컴파일러 플래그를 -std = c ++ 14 에서 -std = c ++ 11로 변경 한 후 간단한 부스트 예제를 빌드 할 때와 동일한 문제가 해결되었습니다 .

그리고 그것이 C ++ 11 예제라는 것을 알았습니다 ...


그것은 내 문제를 해결했습니다. 특히 기본 플래그를 사용할 때 컴파일 중에 사용 된 플래그를 잊기 쉽습니다.
Filipe Calasans 2010 년

3

나는 같은 문제가 있었고 Linux Mint (nuduoz로)도 사용했습니다. 내가 추가 한 후 나는 내 경우 문제는 해결되었다 boost_systemGCC C++ Linker->Libraries.


1

다른 문제가 발생할 수 있습니다. Linux Mint에 Boost를 설치 한 후 동일한 문제가 발생했습니다. 라이브러리에 name이 있기 때문에 연결 -lboost_system하거나 -lboost_system-mt작동하지 않았습니다 libboost_system.so.1.54.0.

따라서 해결책은 원본 파일에 대한 심볼릭 링크를 만드는 것입니다. 나의 경우에는

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

자세한 내용은 질문을 참조하십시오 .


1

라이브러리가 설치되지 않은 경우 부스트 라이브러리 폴더를 제공해야합니다.

예:

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


0

시험

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

/usr/lib/x86_64-linux-gnu/ 부스트 라이브러리의 위치입니다.

find /usr/ -name '*boost*.so'부스트 라이브러리 위치를 찾는 데 사용


0

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

데비안에서 완벽하게 작동했습니다. (apt-get으로 설치된 C ++ 라이브러리 부스트).


0

위에서 설명한 제안 된 솔루션을 테스트 한 후이 몇 줄만 작동한다는 것을 알았습니다.

Ubuntu 16.04를 사용하고 있습니다.

cmake_minimum_required (VERSION 3.13)
프로젝트 (myProject)

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

find_package (Boost 1.58.0 REQUIRED COMPONENTS 시스템 파일 시스템)
target_link_libraries (myProject $ {Boost_LIBRARIES})

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.