包含io_service.hpp和windows.h时的asio - 分段错误

时间:2015-11-23 09:36:30

标签: c++ windows boost-asio

我在Windows上遇到asio的奇怪行为:某些io_service.post()发生了分段错误。这是我使用的代码:

main.cpp中:

#include <asio/io_service.hpp>
#include <windows.h>

#include "foo.h"

asio::io_service ios;

int main()
{
    ios.post(foo);

    ios.run();

    return 0;
}

foo.h中:

#ifndef FOO_H
#define FOO_H

#include <windows.h>
#include <asio/io_service.hpp>

void foo();

#endif

Foo.cpp中:

#include "foo.h"

#include <iostream>

extern asio::io_service ios;

void bar() { std::cout << "bar\n"; }

void foo()
{
    ios.post(bar);
}

我编译:     g ++ -o test.exe -Wall -Wextra -std = c ++ 11 -D_WIN32_WINNT = _WIN32_WINNT_WIN7 -DWIN32_LEAN_AND_MEAN -DASIO_STANDALONE -Iasio-1.10.6 / include foo.cpp main.cpp -lws2_32

(注意:ios全局对象用于简化代码,但在我的真实程序中,io_service对象在main中创建,并通过foo回调中的引用进行访问)。

执行时,我在post电话上遇到分段错误。

我的环境:windows 7,mingw-w64 5.2 with dwarf2,asio 1.10.6。 我使用mingw-w64 4.7.2和4.9.3以及使用boost.asio 1.55获得相同的bug。

要修复崩溃,可以使用一些解决方法:

  • 始终在windows.h之前包含io_service.hpp(反之亦然)
  • 定义ASIO_DISABLE_IOCP(或使用boost.asio时为BOOST_ASIO_DISABLE_IOCP)
  • 不定义_WIN32_WINNT

在报告asio项目的错误之前,我确信我的代码是正确的。对我来说,强加io_service.hpp和windows.h的包含顺序是不可接受的:这两个标题通常间接包含在其他标题中,因此很难控制它。

0 个答案:

没有答案