web-dev-qa-db-ja.com

Boost :: asiowinsockとwinsock2の互換性の問題

私のプロジェクトでは、winsock.hが使用されているwindows.hを使用しており、winsock2を使用するboost:assioを含める必要があります。そのため、Winsock.hがすでに含まれているというエラーが多数発生します。 WIN32_LEAN_AND_MEANを定義できます。 windows.hがwinsockを使用しないようにします。問題は、それを使用するにはwindows.hが必要であり、非同期タイマーにはAsioが必要なことです。 winsock2.hは必要ありません。 winsock2の使用を無効にする方法を検索しようとしましたが、boost:asioを含める前にBOOST_ASIO_NO_WIN32_LEAN_AND_MEANを定義することでそれができることがわかりましたが、それでも同じエラーが発生します。

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

エラー

1> c:\ program files\boost\boost_1_47\boost\asio\detail\socket_types.hpp(22):致命的なエラーC1189:#error:WinSock.hはすでに含まれています

17
Dainius Kreivys

順序またはインクルードを変​​更してみてください。 boost/asio.hppから始めて、その後にwindows.hを置きます。

通常、コードライブラリの作成者は互換性の問題を解決しますが、コードがコンパイラとプリプロセッサに最初に出会う場合は、より適切に解決できます。

ACEにも同様の問題があり、他の何かが解決する前にace /OS.hが含まれます。

23
selalerer

私の場合、インクルードの順序を切り替えると、使用していた別のMicrosoftインクルードでコンパイルエラーが発生しました。これは、「typedefインターフェイス」で宣言していました。

私のエラーはsocket_types.hから来ていたので、これらの行から:

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

Windows.hの前に「winsock2.h」のインクルードを置き、最後にboost/asio.hppインクルードを入れて、問題なくコンパイルしました。

11
Theanderblast

Danius(OP)が次のコンパイルを指摘しているように

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

このエラーで失敗します:

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

一方

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

大量のノイズが発生し、Windowsのバージョン#が正しく設定されていません

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

クリーンなコンパイルを生成します。

<社説>それほど難しいことではないはずです</社説>

10
Dale Wilson

私が使用した他の回避策は、すべてのasio依存コードをXXX.hppファイルに集中させ、オブジェクトを使用するXXX.cppファイルを実装する各ウィンドウの上部に含めることです。

この方法では、includeasioを他のincludewindows.hの上に配置し、問題を回避します。

0
ori
#ifdef BOOST_OS_WINDOWS
#define _WIN32_WINNT 0x0501
#if _WIN32_WINNT <= 0x0501
#define BOOST_ASIO_DISABLE_IOCP
#define BOOST_ASIO_ENABLE_CANCELIO
#endif
#endif
0
William H Myatt