2012-09-13 3 views
2

지난 20 시간 동안 OS X 10.8에서 작업을 보냈습니다. 마침내 오류없이 컴파일하려고했지만, 시도 할 때 Boost.test를 사용하는 테스트 케이스를 컴파일하면 다시 상처를 입는다. 나는 바이너리를 사용하는 대신 스스로 컴파일을하는 이유는 C++ 11과 libC++를 사용하기 때문이다. 내가 부스트를 컴파일 할 때Mac OS X 10.8에서 부스트 1.51.0을 컴파일하고 사용하십시오.

는,이 같은 B2 전화 :

./b2 toolset=clang cxxflags="-std=c++11 -stdlib=libc++" linkflags="-std=c++11 -stdlib=libc++" link=static 

을하며 모든 파일을 컴파일합니다. 그리고 내가 시도

#define BOOST_TEST_DYN_LINK 
#define BOOST_TEST_MODULE Addition 
#include <boost/test/unit_test.hpp> 

int addition(int i, int j) 
{ 
    return i + j; 
} 

BOOST_AUTO_TEST_CASE(universeInOrder) 
{ 
    BOOST_CHECK(addition(2, 2) == 4); 
} 

clang++ -std=c++11 -stdlib=libc++ -g -Wall -v -I/Users/cb/Downloads/boost_1_51_0 tests/arithmetic.cpp -o tests/arithmetic /Users/cb/Downloads/boost_1_51_0/stage/lib/libboost_unit_test_framework.a` 

컴파일하는 코드의 조각을 가지고 그리고 그것은 나에게이 오류주고, 비참하게 실패 : 처음에는

"/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.8.0 -o tests/arithmetic /var/folders/pg/4wcxn1j12c3188vqrv0x4w9r0000gn/T/arithmetic-UFmO1B.o  /Users/cb/Downloads/boost_1_51_0/stage/lib/libboost_unit_test_framework.a -lc++ -lSystem  /usr/bin/../lib/clang/4.0/lib/darwin/libclang_rt.osx.a 
Undefined symbols for architecture x86_64: 
    "boost::unit_test::unit_test_main(bool (*)(), int, char**)", referenced from: 
     _main in arithmetic-UFmO1B.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

을, 나는 생각 부스트가 64 비트 용으로 컴파일되지 않았기 때문에 b2에 구체적으로 그렇게 말하려고 시도했지만 아무런 차이가 없었고 OS X에서 기본적으로 64 비트 용으로 컴파일한다고 생각합니다.

왜 실패하고 어떻게 작동하는지에 대한 아이디어가 있습니까?

답변

5

테스트 결과가 좋지 않은 것처럼 보입니다. 당신은

#define BOOST_TEST_DYN_LINK 

을 요청하지만 boost.test

/Users/cb/Downloads/boost_1_51_0/stage/lib/libboost_unit_test_framework.a 

및 IIRC의 정적 버전을 연결하는 것보다이 라이브러리의 정적 및 동적 버전의 차이가있다. 따라서 라이브러리의 동적 버전 (.so 확장명을 가진 라이브러리)을 연결하거나 해당 정의를 제거하십시오.

+0

boost 설명서에 따르면 BOOST_ [library] _DYN_LINK 기호는 Windows에만 적용되며 TEST 라이브러리는 지원하지 않습니다. 이 문서는 또한 boost.test가 동적으로 링크 할 수 없다는 것을 의미합니다. 그러나 그것은 Linux의 공유 전용 빌드에서 작동하며 OSX 동적 전용 빌드에서는 작동하지 않습니다. – evoskuil

+0

@evoskuil, BOOST_ [라이브러리] _DYN_LINK은 (모든 다른 * 구성 요소에 대해) Windows에서만 명시적인 내보내기/가져 오기 선언이 필요하기 때문에 Windows와 관련이 있습니다. 그러나 정적 버전은'main'을 정의하고 동적 버전은 정의하지 않기 때문에 Boost.Test는 특별합니다. 그래서 심볼은 모든 플랫폼과 관련이 있습니다. –

+0

문서에 포함시키는 것이 좋습니다. 특히 [BOOST_WHATEVER_DYN_LINK] (http://www.boost.org/doc/libs/1_63_0/libs/config/doc/html/index.html)을 고려하십시오. "정적으로 만 링크 될 수있는 라이브러리가있을 수 있습니다 (예 : Boost.Test) ..." – evoskuil