Boost::asio-winsock和winsock 2的兼容性问题
Boost::asio winsock and winsock 2 compatibility issue
我的项目使用了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之上,并解决问题。
- 提升序列化 1:73 的向后兼容性问题
- C++ ABI 兼容性问题/张量流
- Oracle OCCI 和 g++ 7.1 的兼容性问题
- python 和 swig 版本兼容性问题
- Tensorflow C++ API 和 Caffe 兼容性问题与 Glog 相关
- 潜在 DLL 兼容性问题的摘要?
- D3DX10.H和D3DCOMPILER.H兼容性问题
- 类型定义之间的兼容性问题
- 在使用__file__,__line__时,是否存在任何兼容性问题
- Mac和Linux机器之间的正则兼容性问题
- Clang和Visual C 结构兼容性问题
- 从C结构继承的可能兼容性问题
- UNICODESTRING兼容性问题
- 错误:在armadillo和oracle occi兼容性问题中,对"剑"的引用不明确
- box2d光线投射向后兼容性问题
- .NET 和 Linux 之间的 GUID/UUID 兼容性问题
- Boost::asio-winsock和winsock 2的兼容性问题
- 使用控制台的可视C++:while 循环的字符/字符串兼容性问题
- 7-Zip源代码兼容性问题
- Java本机接口(JNI)是否受到c++ ABI兼容性问题的影响