developer tip

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

optionbox 2020. 9. 24. 07:45
반응형

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


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

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

-lboost_system


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

따라서 -lboost_system링커에서 찾을 수 없으면 시도하십시오 -lboost_system-mt.


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

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버튼을 누릅니다.


나는 또한 해결책을 찾았고 내가 만난 대답 중 어느 것도 오류를 해결하지 못했습니다.이 스레드에 대한 "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})

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

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


답변은 실제로 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()

You could come across another problem. After installing Boost on the Linux Mint I've had the same problem. Linking -lboost_system or -lboost_system-mt haven't worked because library have had name libboost_system.so.1.54.0.

So the solution is to create symbolic link to the original file. In my case

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

For more information see this question.


I had the same problem and also use Linux Mint (as nuduoz) . I my case problem was solved after i added boost_system to GCC C++ Linker->Libraries.


try

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

/usr/lib/x86_64-linux-gnu/ is the location of the boost library

use find /usr/ -name '*boost*.so' to find the boost library location


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

worked perfectly under debian. (boost c++ libraries installed with apt-get).


Il the library is not installed you should give boost libraries folder:

example:

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


After testing the proposed solutions described above, I found only these few of lines would work.

I am using Ubuntu 16.04.

cmake_minimum_required(VERSION 3.13)
project(myProject)

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

find_package(Boost 1.58.0 REQUIRED COMPONENTS system filesystem)
target_link_libraries(myProject ${Boost_LIBRARIES})

참고URL : https://stackoverflow.com/questions/13467072/c-boost-undefined-reference-to-boostsystemgeneric-category

반응형