libmongoclient.a boost 라이브러리 컴파일 에러..
안녕하세요
mongodb c++ dirver 설치 후 라이브러리 링크 후 프로세스 컴파일 시 에러 발생합니다.
g++ -o mongotest ux_main.o MongoConn.o FingerprintDB.o FingerprintDB_MongoImpl.o OIndexDB_MongoImpl.o TIndexDB_MongoImpl.o -pthread /usr/local/mongodb/lib/libmongoclient.a /usr/local/lib/libboost_system.a /usr/local/lib/libboost_filesystem.a -L/usr/local/lib -lboost_thread-mt /usr/local/lib/libboost_program_options.a
/usr/local/mongodb/lib/libmongoclient.a(log.o): In function `exists':
/root/mongodb-src-r2.4.9/src/third_party/boost/boost/filesystem/v3/operations.hpp:289: undefined reference to `boost::filesystem3::detail::status(boost::filesystem3::path const&, boost::system::error_code*)'
/usr/local/mongodb/lib/libmongoclient.a(log.o): In function `is_directory':
/root/mongodb-src-r2.4.9/src/third_party/boost/boost/filesystem/v3/operations.hpp:294: undefined reference to `boost::filesystem3::detail::status(boost::filesystem3::path const&, boost::system::error_code*)'
/usr/local/mongodb/lib/libmongoclient.a(log.o): In function `is_regular':
/root/mongodb-src-r2.4.9/src/third_party/boost/boost/filesystem/v3/operations.hpp:315: undefined reference to `boost::filesystem3::detail::status(boost::filesystem3::path const&, boost::system::error_code*)'
collect2: ld returned 1 exit status
make: *** [mongotest] 오류 1
libboost_system.a, libmongoclient.a 등등 링크를 해줬는데 에러가 왜 발생하는걸까요?
mongodb c++ dirver 설치시 부스터를 링크해서 컴파일 해아 하나요?
설치는 http://alloe.tistory.com/m/post/58 이사이트 참고하여 설치하였습니다
답변 부탁드립니다..
우선 참조하는 라이브러리에 해당 심볼이 있는지 확인
우선 참조하는 라이브러리에 해당 심볼이 있는지 확인 부터 해야 할 것 같습니다.
현재 없는 심볼이(undefined reference)
- boost::filesystem3::detail::status
그리고 참조하고 있는 라이브러리가
- /usr/local/lib
- boost_thread-mt
- /usr/local/lib/libboost_program_options.a
- /usr/local/mongodb/lib/libmongoclient.a
등인 것 같은데
nm (프로젝트에 포함된 라이브러리) | c++filt | grep "boost::filesystem3::detail::status"
부터 해보세요.
만약 없으면, 해당 API가 deprecated 됐던가 버전이 안맞아서 없던가(1)
또는 잘못된 라이브러리를 참조 혹은 해당 심볼이 있는 라이브러리를
빼먹고 있는 겁니다.(2)
http://redmine.webtoolkit.eu/
http://redmine.webtoolkit.eu/boards/2/topics/4208?r=4285
http://stackoverflow.com/questions/15634114/cant-link-program-using-boost-filesystem
첫번째는 완전히 동일한 문제고 두번째도 비슷한 경우인것 같네요. 한번 읽어 보면 좋을 것 같습니다.
답변감사드립니다. 질문 하나만 더 드리겠습니다.
# nm libmongoclient.a | c++filt | grep "boost::filesystem3::detail::status"
U boost::filesystem3::detail::status(boost::filesystem3::path const&, boost::system::error_code*)
U boost::filesystem3::detail::status(boost::filesystem3::path const&, boost::system::error_code*)
U boost::filesystem3::detail::status(boost::filesystem3::path const&, boost::system::error_code*)
U boost::filesystem3::detail::status(boost::filesystem3::path const&, boost::system::error_code*)
U boost::filesystem3::detail::status(boost::filesystem3::path const&, boost::system::error_code*)
수행결과로 이렇게 출력되었는데
그러면 제가 libmongoclient.a mongodb c++ driver 라이브러리 생성시
위 함수를 포함한 라이브러리를 포함시키지 못하고 컴파일 한건가요?
좀 오래 되었네요. 네 맞습니다. 포함시키지
좀 오래 되었네요. 네 맞습니다. 포함시키지 않으셨습니다. 각 줄에
U 라고 되어있는건 Undefined 즉, 해당 라이브러리에서 호출하고 있는 것입니다.
따라서 boost::filesystem3가 정의되어 있는 다른 라이브러리를 참조하여 링크해야 할 겁니다.
똑같이 nm 했을 때
T boost::filesystem3::detail::status(boost::filesystem3::path const&, boost::system::error_code*)
와 같이 T(Text, 정의되어있음)가 있어야 합니다.
댓글 달기