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})
'developer tip' 카테고리의 다른 글
업로드하기 전에 파일 크기 가져 오기 (0) | 2020.09.24 |
---|---|
Chrome 개발자 도구를 사용하여 자바 스크립트 편집 (0) | 2020.09.24 |
Android-활동 대 FragmentActivity? (0) | 2020.09.24 |
Spring Boot-application.yml에서 맵 삽입 (0) | 2020.09.24 |
페이지를 다시로드하지 않고 CSS를 다시로드 할 수있는 쉬운 방법이 있습니까? (0) | 2020.09.24 |