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
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.
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
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.
#ifdef BOOST_OS_WINDOWS
#define _WIN32_WINNT 0x0501
#if _WIN32_WINNT <= 0x0501
#define BOOST_ASIO_DISABLE_IOCP
#define BOOST_ASIO_ENABLE_CANCELIO
#endif
#endif
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.