28 votes

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

Mon projet utilise Windows.h dans lequel winsock.h est utilisé, et j'ai besoin d'inclure boost:assio qui utilise winsock2. J'obtiens donc de nombreuses erreurs qui disent que Winsock.h est déjà inclus. Je peux définir WIN32_LEAN_AND_MEAN. pour que Windows.h n'utilise pas winsock. Le problème est que j'ai besoin de Windows.h pour l'utiliser, et j'ai juste besoin d'Asio pour les timers asynchrones. Je n'ai pas besoin de winsock2.h. J'ai essayé de chercher comment désactiver l'utilisation de 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 dossiers \boost\boost_1_47\boost\asio\detail\socket_types.hpp (22) : erreur fatale C1189 : #error : WinSock.h a déjà été inclus

32voto

selalerer Points 1754

Essayez de changer l'ordre des inclusions. Commencez par boost/asio.hpp et mettre windows.h après lui.

En général, les auteurs d'une bibliothèque de codes résolvent les problèmes de compatibilité, mais ils peuvent mieux le faire si leur code est le premier à rencontrer le compilateur et le préprocesseur.

Il y a un problème similaire avec l'ACE, notamment ace/OS.h avant toute autre solution.

17voto

Dale Wilson Points 3089

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\1.51.0\boost\asio\detail\socket_types.hpp(22): fatal error C1189: #error :  WinSock.h has already been included

D'autre part

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

Produit un tas de bruits et définit le numéro de version de Windows de manière incorrecte.

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 n'ai trouvé aucun moyen de contourner le problème sans laisser un mauvais goût, mais ceci :

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

<EDITORIAL> Cela ne devrait pas être si difficile </EDITORIAL>

14voto

Theanderblast Points 161

Pour ma part, l'inversion de l'ordre des inclusions a provoqué des erreurs de compilation avec une autre inclusion Microsoft que j'utilisais - qui déclarait des choses avec "typedef interface".

Puisque mon erreur provenait de socket_types.h, de ces lignes :

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

J'ai mis un include de "winsock2.h" avant le Windows.h, et enfin l'include de boost/asio.hpp, et les choses se sont compilées sans problème.

0voto

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

0voto

ori Points 1

Une autre solution que j'ai utilisée consiste à concentrer toutes les activités dépendantes de l'asio. dans un fichier XXX.hpp et de l'inclure en tête de chaque fichier XXX.cpp implémentant Windows où vous utilisez ses objets. XXX.cpp dans lequel vous utilisez ses objets.

cette méthode place l'include asio au-dessus de tout autre include Windows.h et permet de contourner le problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X