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.Thread Mutex 类型或 boost::details::pool::null_mutex。它被暴露出来,以便用户可以正常声明一些单例池(即同步),但出于效率原因,一些没有同步的单例池(通过指定 boost::details::pool::null_mutex)。成员 typedef mutex 公开此模板参数的值。此参数的默认值为 boost::details::pool::default_mutex ,它是 boost::details::pool::null_mutex 的同义词(当编译器中关闭线程支持时(因此未设置 BOOST_HAS_THREADS),

于 2012-05-04T11:11:01.600 回答
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

我想如果你在包含它之前#define BOOST_DISABLE_THREADS 会解决它。在您必须为您的用户管理此选项到您的构建系统之后。

于 2012-05-04T11:20:44.713 回答
0

从我看到的 boost::pool 对线程库的依赖被添加到 boost 1_48 中(参见1.471.48

我认为这是不幸的,一个更好的决定是只使用标头轻量级互斥锁

您可以更改 pool\detail\mutex.hpp 但与线程库链接可能更简单,尤其是在您使用其他库时。

于 2012-05-04T12:09:57.887 回答