首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost:asio winsock和winsock 2兼容性问题

Boost:asio winsock和winsock 2兼容性问题
EN

Stack Overflow用户
提问于 2012-03-17 13:27:23
回答 5查看 36.8K关注 0票数 24

我的项目使用winsock.h的windows.h,我需要包含boost:assio,它使用winsock2。所以我得到了很多错误,上面写着Winsock.h已经包含了。我可以定义WIN32_LEAN_AND_MEAN。这样窗户就不会用winsock。问题是,我需要windows.h来使用它,而我只需要用于异步计时器的Asio。我不需要它的风向标2.h。我尝试搜索如何禁用它的winsock2使用,我发现在包含boost:asio之前,我可以通过定义BOOST_ASIO_NO_WIN32_LEAN_AND_MEAN来做到这一点,但是仍然会出现同样的错误。

代码语言:javascript
复制
#include <windows.h>
#define BOOST_ASIO_NO_WIN32_LEAN_AND_MEAN
#include <boost/asio.hpp>

误差

files\boost\boost_1_47\boost\asio\detail\socket_types.hpp(22):

1>c:\program致命错误C1189:#error : WinSock.h已经包含了

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-04-29 21:51:23

正如Danius ( OP)指出的那样,

代码语言:javascript
复制
#include <windows.h>
#include <boost/asio.hpp>

此错误失败:

代码语言:javascript
复制
1>c:\source\<SNIP>\boost\1.51.0\boost\asio\detail\socket_types.hpp(22): fatal error C1189: #error :  WinSock.h has already been included

另一方面,

代码语言:javascript
复制
#include <boost/asio.hpp>
#include <windows.h>

产生大量噪声并错误地设置windows版本#

代码语言:javascript
复制
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).

我找不到任何办法避免这件事没有留下不好的味道,但这是:

代码语言:javascript
复制
#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

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

应该没那么难

票数 15
EN

Stack Overflow用户

发布于 2012-03-17 13:44:18

尝试并更改包含的顺序。从boost/asio.hpp开始,然后将windows.h放在后面。

通常,任何代码库的编写者都能解决兼容性问题,但如果他们的代码首先满足编译器和预处理器,他们可以做得更好。

ACE也有一个类似的问题,包括在其他任何问题解决之前都包括ace/OS.h

票数 30
EN

Stack Overflow用户

发布于 2014-04-25 13:36:44

对我来说,用我正在使用的另一个Microsoft (也就是用"typedef接口“声明东西)来切换include的顺序会导致编译错误。

因为我的错误来自socket_types.h,来自以下几行:

代码语言:javascript
复制
# if defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_)
#  error WinSock.h has already been included
# endif // defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_)

我在Windows.h之前添加了一个"winsock2.h“的包含,然后,我最后将boost/asio.hpp包含在其中,然后愉快地编译了所有内容。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9750344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档