Boost::asio-winsock和winsock 2的兼容性问题

Boost::asio winsock and winsock 2 compatibility issue

本文关键字:兼容性 问题 winsock asio-winsock Boost      更新时间:2023-10-16

我的项目使用了windows.h,其中使用了winsock.h,我需要包括使用winsock2的boost:assio。所以我得到了很多错误,说Winsock.h已经包括在内。我可以定义WIN32_EAN_AND_MEAN。这样windows.h就不会使用winsock了。问题是,我需要windows.h来使用它,而我只需要Asio来使用异步定时器。我不需要它的winsock2.h。我试着搜索如何禁用它的winsock2使用,我发现我可以通过在包含BOOST:ASIO之前定义BOOST_ASIO_WIN32_EAN_and_MEAN来做到这一点,但我仍然得到了同样的错误。

#include <windows.h>
#define BOOST_ASIO_NO_WIN32_LEAN_AND_MEAN
#include <boost/asio.hpp>

错误

1> c:\program-filess\boost\boost_1_47\boost\asio\detail\socket_types.hpp(22):致命错误C1189:#error:WinSock.h已包含在中

尝试更改includes的顺序。从boost/asio.hpp开始,然后放上windows.h

通常,任何代码库的编写者都可以解决兼容性问题,但如果他们的代码是第一个遇到编译器和预处理器的,他们可以做得更好。

ACE也有类似的问题,包括ace/OS.h,然后再解决它。

Danius(OP)指出使用进行编译

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

失败并出现以下错误:

1>c:source<SNIP>boost1.51.0boostasiodetailsocket_types.hpp(22): fatal error C1189: #error :  WinSock.h has already been included

另一方面

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

产生一堆噪音并错误地设置窗口版本#

1?  Please define _WIN32_WINNT or _WIN32_WINDOWS appropriately. For example:
1>  - add -D_WIN32_WINNT=0x0501 to the compiler command line; or
1>  - add _WIN32_WINNT=0x0501 to your project's Preprocessor Definitions.
1>  Assuming _WIN32_WINNT=0x0501 (i.e. Windows XP target).

我找不到任何不留下坏味道的方法,但这个:

#ifdef _WIN32
#  ifdef USE_ASIO
//     Set the proper SDK version before including boost/Asio
#      include <SDKDDKVer.h>
//     Note boost/ASIO includes Windows.h. 
#      include <boost/asio.hpp>
#   else //  USE_ASIO
#      include <Windows.h>
#   endif //  USE_ASIO
#else // _WIN32
#  ifdef USE_ASIO
#     include <boost/asio.hpp>
#  endif // USE_ASIO
#endif //_WIN32

确实产生了一个干净的编译。

<编辑>不应该那么难<编辑>

对我来说,切换include的顺序会导致我使用的另一个Microsoft include的编译错误,那就是用"typedef interface"声明东西。

由于我的错误来自socket_types.h,来自以下行:

# if defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_)
#  error WinSock.h has already been included
# endif // defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_)

我在Windows.h之前放了一个include"winsock2.h",然后最后放了boost/asio.hpp include,然后就愉快地编译了。

#ifdef BOOST_OS_WINDOWS
#define _WIN32_WINNT 0x0501
#if _WIN32_WINNT <= 0x0501
#define BOOST_ASIO_DISABLE_IOCP
#define BOOST_ASIO_ENABLE_CANCELIO
#endif
#endif

我使用的另一个解决方案是集中所有依赖于XXX.hpp文件中的代码,并将其包含在实现的每个窗口的顶部XXX、 使用其对象的cpp文件。

这种方法将include-asio放置在任何其他includewindows.h之上,并解决问题。