Boost 라이브러리를 사용하는 Ubuntu 11.10에서 프로그램을 컴파일하려고합니다. Ubuntu Repository의 1.46-dev Boost 라이브러리가 설치되어 있지만 프로그램을 컴파일 할 때 오류가 발생합니다.
undefined reference to boost::system::system_category()
내가 잘못한 것은 무엇입니까?
Boost 라이브러리를 사용하는 Ubuntu 11.10에서 프로그램을 컴파일하려고합니다. Ubuntu Repository의 1.46-dev Boost 라이브러리가 설치되어 있지만 프로그램을 컴파일 할 때 오류가 발생합니다.
undefined reference to boost::system::system_category()
내가 잘못한 것은 무엇입니까?
답변:
사용중인 부스트 라이브러리는 boost_system 라이브러리에 따라 다릅니다. (모두는 아닙니다.)
gcc를 사용한다고 가정 -lboost_system
하고 해당 라이브러리에 링크하기 위해 컴파일러 명령 줄에 추가해보십시오 .
-lboost_system
했으므로 다음과 같이 보입니다 sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system
.. 그것은 ... 도움 생각하지 않았다
sslsniff_LDFLAGS
와 sslsniff_LDADD
Makefile.am과 그 작동하지 않았다. 그런 다음 둘 다 유지 sslsniff_LDFLAGS
하고 sslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp
. 그런 다음 컴파일 할 수있었습니다. 도와 줘서 고마워!
누락 된 기호 (정의하는 라이브러리와 연결하면 -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 이후 헤더 전용 이 기본값 이 된 것으로 보이며이 질문은 쓸모가 없게 만듭니다.
BOOST_ERROR_CODE_HEADER_ONLY
.
전체 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
같은 문제가 있습니다.
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을 부스트했습니다.
제 경우에는 추가 -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에 연결할 수 없습니다!"를 참조하십시오.
... 메인을 정적으로 연결하려는 경우 Jamfile에서 요구 사항에 다음을 추가하십시오.
<link>static
<library>/boost/system//boost_system
그리고 아마도 :
<linkflags>-static-libgcc
<linkflags>-static-libstdc++