2014-11-17 2 views
2

저는 api 라이브러리를 만들고 unittest 프로젝트에 공유로 사용하고 있습니다. API는 어떤 통화를부스트 1.57 파일 시스템/시스템 링커 오류 (gcc 4.9.2 포함)

#include <boost/filesystem.hpp> 

void LoadResources(const std::string& dataPath) 
{ 
    boost::filesystem::path path(dataPath); 
    boost::filesystem::path file("test.txt"); 
    boost::filesystem::path canonical = boost::filesystem::canonical(dataPath/file); 

    if (boost::filesystem::exists(canonical)) { 
     ... 
    } 
} 

그런 다음 단위 테스트는 단지 그 함수를 호출하는 다음과 같은 방법을하고있다하지만 난 때문에 링커 오류

/home/ubuntu/tonkatsu/lib/libdominion.so: undefined reference to `boost::filesystem::detail::canonical(boost::filesystem::path const&, boost::filesystem::path const&, boost::system::error_code*)' 
/home/ubuntu/tonkatsu/lib/libdominion.so: undefined reference to `boost::filesystem::detail::current_path(boost::system::error_code*)' 
/home/ubuntu/tonkatsu/lib/libdominion.so: undefined reference to `boost::system::system_category()' 
/home/ubuntu/tonkatsu/lib/libdominion.so: undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)' 
/home/ubuntu/tonkatsu/lib/libdominion.so: undefined reference to `boost::system::generic_category()' 
/home/ubuntu/tonkatsu/lib/libdominion.so: undefined reference to `boost::filesystem::path::operator/=(boost::filesystem::path const&)' 
collect2: error: ld returned 1 exit status 

의 그것을 만들 수 없습니다하지만 내 CMakeList.txt가 제대로 설정되어

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++14") 
find_package(Boost COMPONENTS system filesystem log thread unit_test_framework REQUIRED) 
... 
target_link_libraries(unittest ${Boost_LIBRARIES} dominion) 

과 함께 할 VERBOSE = 1도

/usr/bin/c++ -Wall -std=c++14 CMakeFiles/unittest.dir/home/ubuntu/tonkatsu/src/unittest/main.cpp.o CMakeFiles/unittest.dir/home/ubuntu/tonkatsu/src/unittest/dominion/api.cpp.o CMakeFiles/unittest.dir/home/ubuntu/tonkatsu/src/unittest/dominion/attributes.cpp.o CMakeFiles/unittest.dir/home/ubuntu/tonkatsu/src/unittest/dominion/dice.cpp.o CMakeFiles/unittest.dir/home/ubuntu/tonkatsu/src/unittest/lib/minicsv.cpp.o -o /home/ubuntu/tonkatsu/bin/unittest -rdynamic /usr/local/lib/libboost_system.so /usr/local/lib/libboost_filesystem.so /usr/local/lib/libboost_log.so /usr/local/lib/libboost_thread.so /usr/local/lib/libboost_unit_test_framework.so -lpthread /home/ubuntu/tonkatsu/lib/libdominion.so -Wl,-rpath,/usr/local/lib:/home/ubuntu/tonkatsu/lib 
정확

부스트 :: 파일 시스템을 사용하기 전에 문제가 없었습니다. 이것은 VS2013에서 잘 작동하지만 GCC 4.9.2를 사용하는 리눅스에서는 이유를 알 수 없습니다. 나는 어쩌면 부스트 버전이 잘못되었다고 생각했다. (우분투는 1.55 만 제공하고 윈도우는 1.57을 사용했다.) 그래서 나는 1.57을 리눅스에도 만들었지 만 오류는 여전히 존재했다. 또한 boost bug은 C++ 11과 관련되어 있지만 1.57로 수정되었습니다.

나는이 주제에 대해 비슷한 질문을했지만 사람들은 주로 boost_system에 연결하는 것을 잊었지만 나는 그렇지 않다는 것을 알았습니다.

+1

링크 라인에서 부스트 전에'dominion'을 표시하려고 했습니까? LDFLAGS에'-Wl, - no-as-needed'를 추가 할 수도 있습니다. –

+0

@MarcGlisse, 정말 고마워요. 부스트 전에 지배력을 행사하는 것이 트릭을 만들었습니다. 나는 그 명령이 중요하다는 것을 몰랐다. 나는 대답으로 코멘트를 표시 할 수 있었으면 좋겠다. – kittikun

+0

[boost :: filesystem :: detail :: copy \ _file]에 대한 C++ BOOST 정의되지 않은 참조의 가능한 복제본 (http://stackoverflow.com/questions/35007134/c) -boost-undefined - 참조 파일 - 참조 파일 시스템 참조 파일 복사 - 파일) –

답변

3

우분투는 암시 적으로 --as-needed을 링커에 전달합니다. 이것은 공유 라이브러리에 대해서조차도 라이브러리의 순서가 중요하다는 것을 의미합니다. 명령 행에서 앞에 나열된 객체가 라이브러리를 사용하지 않으면 그 라이브러리는 버려집니다. 부스트하기 전에 target_link_libraries에있는 dominion을 나열하면 도움이 될 것입니다.