14

ブーストシリアル化を使用しています。私は次のようにコンパイルしました:-L/opt/local/lib -lboost_serialization -stdlib=libc++、しかしいくつかの(不可解な)エラーが発生しました:

アーキテクチャx86_64の未定義のシンボル:
  "boost :: archive :: text_oarchive_impl :: save(std :: __ 1 :: basic_string、std :: __ 1 :: allocator> const&)"、参照元:
      void boost :: archive :: save_access :: save_primitive、std :: __ 1 :: allocator >>(boost :: archive :: text_oarchive&、std :: __ 1 :: basic_string、std :: __ 1 :: allocator> const&) .o
  "boost :: archive :: basic_text_oprimitive >> ::〜basic_text_oprimitive()"、参照元:
      main.oのboost::archive :: text_oarchive_impl ::〜text_oarchive_impl()
  "boost :: archive :: text_oarchive_impl :: text_oarchive_impl(std :: __ 1 :: basic_ostream>&、unsigned int)"、参照元:
      main.oのboost::archive :: text_oarchive :: text_oarchive(std :: __ 1 :: basic_ostream>&、unsigned int)
ld:アーキテクチャx86_64のシンボルが見つかりません

私はシリアル化していstd::vector<std::string>ます:

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

Boostのインストールに問題はありますか?


Boostライブラリは、32ビットと64ビットの両方のマシンコードを含むユニバーサルバイナリです(これは私が推測する問題ではありません)。

$ファイルlibboost_serialization.dylib
libboost_serialization.dylib:2つのアーキテクチャを備えたMach-Oユニバーサルバイナリ
libboost_serialization.dylib(アーキテクチャi386用):Mach-O動的リンク共有ライブラリi386
libboost_serialization.dylib(アーキテクチャx86_64用):Mach-O64ビット動的リンク共有ライブラリx86_64

sudo port install boost +universalMac OSX10.7を使用してboostをインストールしました。

4

2 に答える 2

17

次のコードを使用して問題を再現できます。

#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++または使用して、とリンクするときに問題なくコンパイルおよびリンクします。ただし、リンクで使用すると、基本的にエラーメッセージの引用で失敗します(私はBoostをインストールしています):clang++-lboost_serializationclang++libc++/opt/boost

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

これに基づいて、-stdlib = libc ++を使用したビルドでは、独自の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は、ほぼ確実に意図したものではありませんが、うまくいくようです。「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
于 2012-01-08T23:53:47.420 に答える
0

Boostライブラリは32ビットのようです。

これは、ヘッダーのみではない数少ないブーストユーティリティの1つを使用しようとするまで気付かない問題です。

于 2012-01-04T15:00:43.540 に答える