컴파일시 boost :: system :: system_category ()에 대한 정의되지 않은 참조


105

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

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

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


6
이것은 컴파일러 오류가 아니라 링커 오류입니다. Boost.System 라이브러리에 연결해야합니다.
ildjarn

답변:


160

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

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


3
컴파일을 위해 g ++ Makefile을 사용하고 있습니다. 보통 그런 깃발을 어디에 두나요?
user1049697

2
컴파일러 / 링커 명령 줄이 어셈블되는 방법은 경우에 따라 크게 다릅니다. Makefile (또는 관련 부분)을 질문에 붙여 넣지 않으시겠습니까? 이렇게하면 특정 경우에 적합한 답변을 얻을 수 있습니다.
hc_

7
좋아, Makefile.am을 편집하고을 추가 -lboost_system했으므로 다음과 같이 보입니다 sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system.. 그것은 ... 도움 생각하지 않았다
user1049697

1
여전히 같은 오류입니까? autoreconf나중에 뛰었 어 ? 또한, 이 게시물이 하나 귀하의 autotools를 구성 당신을 도움이 될 수 있습니다.
hc_

2
나는 대체 sslsniff_LDFLAGSsslsniff_LDADDMakefile.am과 그 작동하지 않았다. 그런 다음 둘 다 유지 sslsniff_LDFLAGS하고 sslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp. 그런 다음 컴파일 할 수있었습니다. 도와 줘서 고마워!
user1049697

62

누락 된 기호 (정의하는 라이브러리와 연결하면 -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 이후 헤더 전용 이 기본값 이 된 것으로 보이며이 질문은 쓸모가 없게 만듭니다.


4
감사!!! 내가 부스트 1.41 (CentOS의 SL) 저를 해제 유일한의 -DBOOST_SYSTEM_NO_DEPRECATED 사용하고 사용하기 때문에 아무 도움이되지
로저 래빗

5
사실 당신은 할 수 있습니다 무엇 -DBOOST_ERROR_CODE_HEADER_ONLY이다
앤드류 마샬

1
흥미롭게도 system_category () 등에 대한 참조가 적은 새로운 Boost 1.66 동작 은 링크 순서 문제가있는 경우 새로운 링크 문제를 일으킬 수 있습니다. 예를 들어 github.com/PointCloudLibrary/pcl/pull/2236 을 참조하십시오
pixelbeat

3
CMake를 사용하는 경우 'add_definitions (-DBOOST_ERROR_CODE_HEADER_ONLY)'를 추가하십시오.
nickolay

1
Boost 1.68에서 나를 위해 일한 유일한 수정 사항은 BOOST_ERROR_CODE_HEADER_ONLY.
sakra

17

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

-DBOOST_ERROR_CODE_HEADER_ONLY.

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


1
최근에이 문제를 발견했습니다. 이것 외에는 아무것도 작동하지 않습니다. Marc Glisse의 답변에서 언급했듯이 이것이 여전히 부스트로 인해 낙담하는지 궁금합니다.
John Z. Li

1
quote "Boost.System은 이제 헤더 전용입니다. 스텁 라이브러리는 호환성을 위해 빌드되었지만 더 이상 링크 할 필요가 없습니다."
John Z. Li

16

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

-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

5
-l과 라이브러리 이름 사이의 공백이 올바르지 않습니다. -lboost_system을 사용해야합니다
portforwardpodcast

1
나는 centos가 -l의 위치에 대해 신경 쓰지 않았지만 우분투가 했으므로 끝에 있어야한다는 것을 알았습니다.
ask_io

7

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

find_package(Boost COMPONENTS system ...)

그리고 아닙니다

find_package(boost COMPONENTS system ...)

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


6

같은 문제가 있습니다.

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

그런데 왜?


1
어딘가에 디버그 플래그가 정의되어 있으므로 디버그에 다른 라이브러리가 내장되어 있거나 g ++가 디버그 obj를 생성하고 있었습니까?
noonex

4

이 문제가 있었을 때 원인은 도서관 주문이었습니다. 그것을 고치기 위해 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을 부스트했습니다.


1
이것도 제 문제였습니다. 나는 그것을 CMake를 통해 포함 시켰고, 어떤 이유로 든 의존성과 순서가 FindBoost 스크립트에서 해결되었다고 가정했습니다. 하지만 내 문제는 항상 공유 라이브러리를 사용하고 전혀주의를 기울이지 않고 정적 라이브러리로 이동하고 빌드 오류가 발생하는 것이 었습니다. 죄송합니다.
Anthony

이것은 나를 위해 그것을 고쳤습니다 ...이 솔루션 이전에는 BOOST_ERROR_CODE_HEADER_ONLY를 정의하는 것이 유일했습니다. Ubuntu 18.04에서는 cmake를 사용하여 1.68을 부스트하십시오. 내 수정 : target_link_libraries (실행 pthread와 SSL 암호화 boost_system)
루이스

2

제 경우에는 추가 -lboost_system만으로는 충분하지 않았지만 여전히 내 사용자 지정 빌드 환경에서 찾을 수 없었습니다. Get rid of "gcc-/ usr / bin / ld : warning lib not found" 의 조언을 사용하고 ./configure명령을 다음 과 같이 변경 해야했습니다.

./configure CXXFLAGS="-I$HOME/include" LDFLAGS="-L$HOME/lib -Wl,-rpath-link,$HOME/lib" --with-boost-libdir=$HOME/lib --prefix=$HOME

자세한 내용은 Boost 1.51 : "오류 : boost_thread에 연결할 수 없습니다!"를 참조하십시오.


1

... 메인을 정적으로 연결하려는 경우 Jamfile에서 요구 사항에 다음을 추가하십시오.

<link>static
<library>/boost/system//boost_system

그리고 아마도 :

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