2012-01-04 4 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

シリアル化ライブラリをどのように使用しようとしているかを示す小さな例を投稿できますか?私はそれを使用していないが、私は実際のテストケースを持っていれば問題を追跡することができると確信している。 –

答えて

16

私は、次のコードを使用して問題を再現できます。それぞれのデフォルトフラグをg++またはclang++を使用して-lboost_serializationとリンクする際

#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; 
} 

これは、コンパイルされ、問題なくリンク。私は-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 installation guideに基づいて使用して1を:

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に行われた編集はほぼ確実に意図したものではありませんが、彼らはトリックを行うように見える:私は「bjam」について多くを知らないだけI適切な場所を見つけることを試みた変更を適用します。インストールのいくつかのステップでは、保護されたディレクトリに物をインストールするのに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ビットである可能性があります。

これは、ヘッダーのみではない少数のboost utilのうちの1つを使用しようとするまで気付かない問題です。

+0

ユニバーサルバイナリでboostを再インストールしています。 brb –

+2

コマンド "file * boost_ser * .so"を実行します。それは32ビットアーチか64ビットアーチのどちらであるかをあなたに伝えます。 – Arunmu

+0

"libboost_serialization。dylib:Mach-O 64ビット動的リンク共有ライブラリx86_64 "mmm ... –

関連する問題