Boost:: asio winsock et winsock 2 Problème de compatibilité

Mon projet utilise windows.h dans lequel winsock.h est utilisé, et je dois inclure boost:assio qui utilise winsock2. Donc j'ai beaucoup d'erreurs qui disent Winsock.h déjà inclus. Je peux définir WIN32_LEAN_AND_MEAN. alors que windows.il n'utiliserait pas winsock. Le problème, c'est que j'ai besoin de fenêtres.H pour l'utiliser, et J'ai juste besoin D'Asio pour les minuteries asynchrones. Je n'ai pas besoin de son winsock2.h. J'ai essayé de chercher comment désactiver son utilisation winsock2, et j'ai trouvé que je pouvais le faire en définissant BOOST_ASIO_NO_WIN32_LEAN_AND_MEAN avant d'inclure boost: asio, mais j'obtiens toujours la même erreur.

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

Erreur

1>c:program fichiersboostboost_1_47boostasiodetailsocket_types.hpp(22): erreur fatale C1189: #erreur : WinSock.h a déjà été inclus

17
demandé sur Brian Tompsett - 汤莱恩 2012-03-17 17:27:23

5 réponses

essayez de changer l'ordre ou includes. Commencez par boost / asio.hpp et mettre des fenêtres.h après.

habituellement les rédacteurs de n'importe quelle bibliothèque de code résolvent les problèmes de compatibilité mais ils peuvent le faire mieux si leur code est le premier à rencontrer le compilateur et le préprocesseur.

il y a un problème similaire avec ACE, y compris ace/OS.h avant que quoi que ce soit d'autre le résolve.

19
répondu selalerer 2012-03-17 13:44:18

comme le souligne Danius (L'OP) une compilation avec

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

échoue avec cette erreur:

1>c:\source\<SNIP>\boost.51.0\boost\asio\detail\socket_types.hpp(22): fatal error C1189: #error :  WinSock.h has already been included

d'un autre côté

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

produit un tas de bruit et place la version windows # incorrectement

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).

je ne pouvais pas trouver n'importe quel moyen de contourner ce qui n'a pas laissé de mauvais goût, mais c':

#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

produit une compilation propre.

<ÉDITORIAL> Il ne devrait pas être dur

10
répondu Dale Wilson 2013-05-10 16:27:50

pour moi, changer l'ordre des includes a causé des erreurs de compilation avec une autre include Microsoft que J'utilisais - qui déclarait des choses avec "typedef interface".

puisque mon erreur provenait de socket_types.h, à partir de ces lignes:

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

j'ai mis un INCLU DE " winsock2.h" avant le chargement de Windows.h, et enfin le boost / asio.php include, et les choses ensuite compilé heureusement.

8
répondu Theanderblast 2014-04-25 13:36:44
#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
répondu William H Myatt 2016-11-16 06:42:54

une autre solution que j'ai utilisée est de concentrer tous les code dans un XXX.HPP fichier et l'inclure sur le dessus de chaque mise en œuvre de windows XXX.cpp fichier où vous pouvez utiliser ses objets.

cette méthode place l'include asio au-dessus de toute autre include windows.h et de travail autour du problème.

0
répondu ori 2017-09-28 10:45:39