2012-01-04 3 views
12

부스트 직렬화를 사용하고 있습니다. 나는 컴파일 : -L/opt/local/lib -lboost_serialization -stdlib=libc++,하지만 몇 가지 (ungooglable) 오류 가지고 :부스트 직렬화를 사용할 때의 링커 오류

 
Undefined symbols for architecture x86_64: 
    "boost::archive::text_oarchive_impl::save(std::__1::basic_string, std::__1::allocator > const&)", referenced from: 
     void boost::archive::save_access::save_primitive, std::__1::allocator > >(boost::archive::text_oarchive&, std::__1::basic_string, std::__1::allocator > const&) in main.o 
    "boost::archive::basic_text_oprimitive > >::~basic_text_oprimitive()", referenced from: 
     boost::archive::text_oarchive_impl::~text_oarchive_impl() in main.o 
    "boost::archive::text_oarchive_impl::text_oarchive_impl(std::__1::basic_ostream >&, unsigned int)", referenced from: 
     boost::archive::text_oarchive::text_oarchive(std::__1::basic_ostream >&, unsigned int) in main.o 
ld: symbol(s) not found for architecture x86_64 

내가 직렬화 오전 std::vector<std::string> :

boost::archive::text_oarchive oa(std::cout); 
oa << tasks; 

부스트의 내 설치에 문제가 있습니까? 내가 sudo port install boost +universal를 사용하여 부스트를 설치

 
$ file libboost_serialization.dylib 
libboost_serialization.dylib: Mach-O universal binary with 2 architectures 
libboost_serialization.dylib (for architecture i386): Mach-O dynamically linked shared library i386 
libboost_serialization.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64 

:


부스트 라이브러리는 32 비트 및 64 비트 컴퓨터 코드를 포함하는 범용 바이너리이다 (그래서 내가 추측 문제가되지 않습니다) Mac OS X 10.7에서.

+0

어쩌면 부스트 사용하는 것보다 다른 컴파일러로 만들어진? 나는 과거에 맥 포트와 비슷한 문제를 가지고 있었지만 너무 오래 전에 세부 사항을 기억하고있다. – ergosys

+0

직렬화 라이브러리 사용 방법을 보여주는 작은 예제를 게시 할 수 있습니까? 나는 그것을 사용하지는 않았지만, 일단 작동하는 테스트 케이스가 생기면 문제를 추적 할 수 있다고 확신한다. (in : 문제를 보여준다.) –

답변

16

나는 다음과 같은 코드를 사용하여 문제를 재현 할 수 :

#include "boost/archive/text_oarchive.hpp" 
#include "boost/serialization/vector.hpp" 
#include <vector> 
#include <string> 

int main() 
{ 
    std::vector<std::string> tasks; 
    boost::archive::text_oarchive oa(std::cout); 
    oa << tasks; 
} 

이 각각의 기본 플래그 g++ 또는 clang++을 사용하고 -lboost_serialization와 링크 할 때 컴파일 문제없이 연결됩니다. 내가 -stdlib = libc의 ++로 빌드가 자신의 부스트를 가지고 싶어한다고 가정이를 바탕으로

clang++ -c -stdlib=libc++ -I/opt/boost -W -Wall -ansi serialize.cpp 
clang++ -o serialize.tsk -L/opt/boost/stage/lib -stdlib=libc++ serialize.o -lboost_serialization 

그러나, libc++ 연결로 clang++를 사용할 때 것은 (내가 /opt/boost에 설치 부스트 (Boost) 한) 본질적으로 오류 메시지 견적 실패

tar jxvf ~/Downloads/boost_1_48_0.tar.bz2 
cd boost_1_48_0/tools/build/v2 

# change the build rules to use -stdlib=libc++: 
mv tools/clang-darwin.jam tools/clang-darwin.jam.orig 
sed -e 's/CONFIG_COMMAND)"/CONFIG_COMMAND)" -stdlib=libc++/' < tools/clang-darwin.jam.orig > tools/clang-darwin.jam 

./boostrap.sh 
sudo ./b2 install --prefix=/opt/boost-clang 
cd ../../.. 
/opt/boost-clang/bin/b2 --build-dir=/opt/tmp toolset=clang stage 
sudo /opt/boost-clang/bin/b2 --build-dir=/opt/tmp toolset=clang install --prefix=/opt/boost-clang 

나는 거의 확실하게 그 의도되지 않은 clang-darwin.jam로 만든 편집하지만 트릭을 할 것 같다 : 빌드를 구축 Boost installation guide에 근거하여 나는 "bjam"에 대해 많이 알고 그냥하지 않습니다 적절한 위치를 찾으려고 시도했다. 변경 사항을 적용하십시오. 설치의 일부 단계는 보호 된 디렉토리에 항목을 설치하기 위해 sudo을 사용합니다. 분명히 쓰기 권한이있는 다른 디렉토리에도 설치할 수 있습니다. 방금 실수로 컴퓨터가 엉망이되는 것을 방지하기 위해 컴퓨터에 물건을 설치했습니다. 나는이 프로그램을 성공적으로 구축 할 수있는 장소에서이 설치 그러나

:

/opt/llvm/bin/clang++ -stdlib=libc++ -W -Wall -ansi -I/opt/boost-clang -c -o serialize.o serialize.cpp 
/opt/llvm/bin/clang++ -stdlib=libc++ -L/opt/boost-clang/lib serialize.o -lboost_serialization -o serialize.tsk 
0

부스트 라이브러리가 32 비트 일 수 있습니다.

헤더 전용이 아닌 몇 가지 부스트 유틸리티 중 하나를 사용하려고 할 때까지 알지 못하는 문제입니다.

+0

유니버설 바이너리로 부스트를 다시 설치하고 있습니다. brb –

+2

"file * boost_ser * .so"명령을 실행하십시오. 그것은 32 비트 아치 또는 64 비트 아치를위한 것인지 여부를 알려줍니다. – Arunmu

+0

"libboost_serialization.dylib : Mach-O 64 비트 동적 링크 공유 라이브러리 x86_64 "mmm ... –