现在的位置: 首页 > 综合 > 正文

asio-异步编译错误

2012年07月06日 ⁄ 综合 ⁄ 共 2601字 ⁄ 字号 评论关闭
#include <iostream>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/asio.hpp>

void print(const boost::system::error_code  &e,
           boost::asio::deadline_timer* t,  int *count)
{
    if ( *count < 5)
    {
        std::cout << *count << " ";
        ++(*count);

        t->expires_at( t->expires_at() + boost::posix_time::seconds(1) );
        t->async_wait( boost::bind(print,
            boost::asio::placeholders::error, t, count ));
    }
}

int main()
{
    boost::asio::io_service io;

    int count = 0;

    boost::asio::deadline_timer t ( io, boost::posix_time::seconds(1) );

    t.async_wait( boost::bind(print,
        boost::asio::placeholders::error , &t, &count ));

    io.run();

    std::cout << "final count is :" << count << std::endl;

    return 0;

}

将上面的内容(asio官方的异步timer教程)在vs2005下编译时会出现一个错误,该错误是一个包含windows.h头文件的错误,虽然我们没有编写包含windows.h头文件的申明,但是asio库中的microsec_time_clock.hpp头文件包含了windows.h头文件,因此修改此方案的方式在包含windows.h头文件的前面写一个宏定义:

#ifdef BOOST_HAS_FTIME
#define WIN32_LEAN_AND_MEAN             // 这一行是后来添加进去的
#include <windows.h>
#endif

此时,再次编译,有可能会出现无法找到libboost_date_time-vc80-mt-s-1_35.lib库文件,修改的方案是将libboost_date_time-vc80-mt-1_35.lib库文件复制一份,然后命名为libboost_date_time-vc80-mt-s-1_35.lib,至于为什么这样做是可以的,我也不是很清楚。

再次编译,可能还会出现找不到libboost_system-vc80-mt-s-1_35.lib库文件的错误,同上面的,将libboost_system-vc80-mt-1_35.lib库文件更名为libboost_system-vc80-mt-s-1_35.lib。

说明:
  1、vc80 -- 即表示vs2005
  2、如果你没有上面的库,那么google一下,如何编译boost库,google上面很多很多。既然要用boost,免不了需要编译部分boost库,如何编译仅需要的库我还没有学会,因此不要问我啦!
  3、希望该记录能够为那些碰到类似问题的网友提供一个抛砖引玉的方法。
 
参考:
 关于windows.h头文件错误的提问:
      http://www.nabble.com/WinSock.h-has-already-been-included-td18329342.html

后记:
  后来还给出了另外一种实现方式,但是编译时发现较多错误,因此也在这边记录下来。

#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

class  printer
{
public:
    printer(boost::asio::io_service &io)
        : _timer(io, boost::posix_time::seconds(1))
        , _count(0)
    {
        _timer.async_wait( boost::bind<void>( boost::mem_fn(&printer::print),this));
       // _timer.async_wait( boost::bind( &printer::print,this) ); //编译错误,修改为上面方式即可
    }

    ~printer()
    {
        std::cout << "Final count is " << _count << " " << std::endl;
    }
    void print()
    {
        if( _count < 5)
        {
            std::cout << _count << std::endl;
            _count++;
            _timer.expires_at( _timer.expires_at() + boost::posix_time::seconds(1) );
            _timer.async_wait( boost::bind<void>(boost::mem_fn(&printer::print), this));
      // _timer.async_wait( boost::bind( &printer::print,this) ); //编译错误,修改为上面方式即可

        }
    }
protected:
private:
    boost::asio::deadline_timer _timer;
    int    _count;
};

int main()
{
    //boost::asio:io_service io;
    boost::asio::io_service io;
    printer p(io);
    io.run();

    return 0;
}

抱歉!评论已关闭.