【问题标题】:Using Boost.Pool in VS2010 - Linker error在 VS2010 中使用 Boost.Pool - 链接器错误
【发布时间】:2012-05-04 10:52:12
【问题描述】:

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?

【问题讨论】:

  • boost::singleton_pool 使用的是mutex 类型,该类型位于boost::thread 库中。因此需要链接 libboost_thread。
  • 如果你查看 boost\pool\detail\mutex.hpp 似乎池库定义了它自己的互斥体并且没有引用 boost::thread 库
  • @MariusBucur:我会再次检查,以验证我的答案。
  • @nabulke 实际上 boost::pool 1.49 使用了 boost::thread,我正在查看版本 1.47,它定义了自己的互斥锁 (boost.org/doc/libs/1_47_0/boost/pool/detail/mutex.hpp)。如果不需要与线程库链接,则可以选择使用较旧的池库版本。

标签: c++ boost


【解决方案1】:

boost::singleton_pool 正在使用位于boost::thread 中的默认互斥锁实现,它只是不是 标头。

请参阅下面引用的singleton_pool header 以获取有关如何删除依赖项的信息:​​

Mutex 此类是用于保护的互斥锁类型 同时访问底层池。可以是任何 Boost.Thread 互斥体类型或 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),或 线程支持已被明确禁用 BOOST_DISABLE_THREADS(Boost-wide 禁用线程)或 BOOST_POOL_NO_MT(仅限此库))或用于 boost::mutex (在编译器中启用线程支持时)。

【讨论】:

    【解决方案2】:

    在 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 在包含它之前会解决它。 在您必须为您的用户管理此选项到您的构建系统之后。

    【讨论】:

      【解决方案3】:

      据我所知,boost::pool 对线程库的依赖是在 boost 1_48 中添加的(参见 1.471.48

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

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

      【讨论】:

        猜你喜欢
        • 2012-08-12
        • 1970-01-01
        • 1970-01-01
        • 2012-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-20
        • 1970-01-01
        相关资源
        最近更新 更多