컴파일시 boost :: system :: system_category ()에 대한 정의되지 않은 참조 Ubuntu 11.10에서 프로그램을

Boost 라이브러리를 사용하는 Ubuntu 11.10에서 프로그램을 컴파일하려고합니다. Ubuntu Repository의 1.46-dev Boost 라이브러리가 설치되어 있지만 프로그램을 컴파일 할 때 오류가 발생합니다.

undefined reference to boost::system::system_category()

내가 잘못한 것은 무엇입니까?



답변

사용중인 부스트 라이브러리는 boost_system 라이브러리에 따라 다릅니다. (모두는 아닙니다.)

gcc를 사용한다고 가정 -lboost_system하고 해당 라이브러리에 링크하기 위해 컴파일러 명령 줄에 추가해보십시오 .


답변

누락 된 기호 (정의하는 라이브러리와 연결하면 -lboost_system)이 확실한 해결책이지만, Boost.System의 특별한 경우에, 원래의 디자인에 misfeature는 사용하게 boost::system::generic_category()하고 boost::system::system_category()불필요. 플래그를 -DBOOST_SYSTEM_NO_DEPRECATED사용 하여 컴파일 하면 해당 코드가 비활성화되고 많은 프로그램이 필요없이 컴파일 될 수 있습니다 -lboost_system(라이브러리의 일부 기능을 명시 적으로 사용하는 경우 해당 링크는 물론 여전히 필요합니다).

Boost 1.66 및 이 커밋 부터이 동작은 이제 기본값이므로이 답변이 필요한 사용자가 점점 줄어들기를 바랍니다.

@AndrewMarshall에서 알 수 있듯이 대안은 BOOST_ERROR_CODE_HEADER_ONLY코드의 헤더 전용 버전을 사용 하도록 정의 하는 것입니다. 일부 기능이 손상 될 수 있기 때문에 Boost 에서 권장하지 않았습니다 . 그러나 1.69 이후 헤더 전용 이 기본값 이 된 것으로 보이며이 질문은 쓸모가 없게 만듭니다.


답변

전체 shebang이 필요하지 않은 사람들을위한 또 다른 해결 방법 : 스위치 사용

-DBOOST_ERROR_CODE_HEADER_ONLY.

CMake를 사용하는 경우 add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY).


답변

위의 오류는 링커 오류입니다. 링커 는 컴파일러에 의해 생성 된 하나 이상의 개체를 가져와 단일 실행 프로그램으로 결합하는 프로그램입니다.

-lboost_system링커 boost::system::system_category()에 라이브러리에서 와 같은 기호를 찾아야 함을 나타내는 링커 플래그를 추가 해야합니다 libboost_system.so.

main.cpp가있는 경우 다음 중 하나를 수행하십시오.

g++ main.cpp -o main -lboost_system

또는

g++ -c -o main.o main.cpp
g++ main.o -lboost_system


답변

CMAKE 및 find_package를 사용할 때 다음을 확인하십시오.

find_package(Boost COMPONENTS system ...)

그리고 아닙니다

find_package(boost COMPONENTS system ...)

어떤 사람들은 그 때문에 시간을 잃었을 수 있습니다 …


답변

같은 문제가 있습니다.

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   \
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-1_47 -lboost_filesystem-mgw45-mt-1_47

D : /bfs_ENTW_deb/obj/test/main_filesystem.obj : main_filesystem.cpp :(. text + 0x54) :`boost :: system :: generic_category ()에 대한 정의되지 않은 참조

해결책은 system-lib의 디버그 버전을 사용하는 것입니다.

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   \
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-d-1_47 -lboost_filesystem-mgw45-mt-1_47

그런데 왜?


답변

이 문제가 있었을 때 원인은 도서관 주문이었습니다. 그것을 고치기 위해 libboost_system마지막에 넣었습니다 .

g++ mingw/timer1.o -o mingw/timer1.exe  -L/usr/local/boost_1_61_0/stage/lib \
    -lboost_timer-mgw53-mt-1_61 \
    -lboost_chrono-mgw53-mt-1_61 \
    -lboost_system-mgw53-mt-1_61

이것은 gcc 5.3의 mingw에 있었고 간단한 타이머 예제로 1.61.0을 부스트했습니다.