在VS2010中使用Boost.Pool - 链接器错误

时间:2012-05-04 10:52:13

标签: c++ boost

Boost.Pool documentation说(强调我的):

  

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?

3 个答案:

答案 0 :(得分:2)

boost::singleton_pool使用位于boost::thread的默认互斥锁实现,该实施仅标头。

有关如何删除依赖关系的信息,请参阅下面引用的singleton_pool header

  

Mutex 此类是用于保护的互斥锁类型   同时访问底层池。可以是任何Boost.Thread   互斥类型或boost :: details :: pool :: null_mutex。它是   暴露,以便用户可以正常声明一些单身池(即,   与同步),但一些单独的池没有   同步(通过指定   出于效率原因,boost :: details :: pool :: null_mutex)。   成员typedef互斥体公开此模板的值   参数。此参数的默认值为   boost :: details :: pool :: default_mutex这是两者的同义词   boost :: details :: pool :: null_mutex(当线程支持是   在编译器中关闭(因此未设置BOOST_HAS_THREADS),或   线程支持已明确禁用   BOOST_DISABLE_THREADS(在线程范围内禁用线程)或   BOOST_POOL_NO_MT(仅限此库))或用于boost :: mutex   (在编译器中启用了线程支持时)。

答案 1 :(得分: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 包括它之前会解决它。 之后,您必须为您的用户管理此选项到您的构建系统中。

答案 2 :(得分:0)

从我看到的提升1_48中添加了对线程lib的boost :: pool依赖(参见1.471.48

我认为这是不幸的,更好的决定只使用标题lightweight mutex

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