4

Boost.Poolのドキュメントには次のように書かれています (強調は私のものです):

Boost Pool ライブラリはヘッダーのみのライブラリです。つまり、ビルドする .lib、.dll、または .so はありません。Boost ディレクトリをコンパイラのインクルード ファイル パスに追加するだけで、準備完了です。

しかし、VS2010 SP1 で次のようなコードをコンパイルしようとすると:

#include <string>
#include <vector>

#include <boost\pool\pool_alloc.hpp>

int main()
{
    typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, 
        boost::pool_allocator<wchar_t>> PoolString;

    std::vector<PoolString> vec;
    for (int i = 0; i < 100; i++)
    {
        PoolString s(L"Some test string. ABCDEF.");
        vec.push_back(s);
    }

    // Release pool memory
    boost::singleton_pool<boost::pool_allocator_tag, sizeof(wchar_t)>::release_memory();

    return 0;
}

リンカー エラーが発生しました。

エラー LNK1104: ファイル 'libboost_thread-vc100-mt-gd-1_49.lib' を開けません

Boost.Pool のドキュメントは間違っていますか? ここで何が欠けていますか?Boost.Pool はどのように使用できますか?

4

3 に答える 3

2

boost::singleton_pool、にあるデフォルトのミューテックス実装を使用しています。これはヘッダーのみboost::threadではありません。

依存関係を削除する方法については、以下に引用されているsingleton_poolヘッダーを参照してください。

ミューテックスこのクラスは、基盤となるプールへの同時アクセスを保護するために使用するミューテックスのタイプです。Boost.ThreadMutexタイプまたはboost::details :: pool::null_mutexを指定できます。これは、ユーザーが通常どおり(つまり、同期あり)一部のシングルトンプールを宣言できるように公開されていますが、効率上の理由から(boost :: details :: pool :: null_mutexを指定することにより)同期なしの一部のシングルトンプールを宣言できます。メンバーtypedefmutexは、このテンプレートパラメーターの値を公開します。このパラメーターのデフォルトはboost::details :: pool :: default_mutexであり、これはいずれかのboost :: details :: pool :: null_mutexの同義語です(コンパイラーでスレッドサポートがオフになっている場合(したがって、BOOST_HAS_THREADSが設定されていない場合)、

于 2012-05-04T11:11:01.600 に答える
0

私が見るところ、スレッド lib に対する boost::pool の依存関係は、boost 1_48 で追加されました ( 1.47および1.48を参照)。

これは残念なことだと思います。ヘッダーのみの軽量ミューテックスを使用する方が良い決定でした。

pool\detail\mutex.hpp を変更できますが、特に他のライブラリを使用している場合は、おそらくスレッド ライブラリとリンクする方が簡単です。

于 2012-05-04T12:09:57.887 に答える
0

boost/config/user.hpp:261 には

//
// Turn threading support off if BOOST_DISABLE_THREADS is defined:
//
#if defined(BOOST_DISABLE_THREADS) && defined(BOOST_HAS_THREADS)
#  undef BOOST_HAS_THREADS
#endif

含める前に BOOST_DISABLE_THREADS を #define すると解決すると思います。おそらく、ユーザーのためにビルドシステムでこのオプションを管理する必要があります。

于 2012-05-04T11:20:44.713 に答える