2012-03-17 15 views
16

Il mio progetto utilizza windows.h in cui viene utilizzato winsock.h e ho bisogno di includere boost: assio che utilizza winsock2. Quindi ricevo molti errori che indicano che Winsock.h è già incluso. Posso definire WIN32_LEAN_AND_MEAN. in modo che windows.h non usasse winsock. Il problema è che ho bisogno di windows.h per usarlo, e ho solo bisogno di Asio per i timer asincroni. Non ho bisogno del suo winsock2.h. Ho provato a cercare come disabilitare il suo uso di winsock2, e ho scoperto che potevo farlo definendo BOOST_ASIO_NO_WIN32_LEAN_AND_MEAN prima di includere boost: asio, ma ho ancora lo stesso errore.Boost :: asio winsock e winsock 2 problema di compatibilità

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

errore

1>c:\program files\boost\boost_1_47\boost\asio\detail\socket_types.hpp(22): fatal error C1189: #error : WinSock.h has already been included

risposta

16

cercare di cambiare l'ordine o include. Inizia con boost/asio.hpp e metti windows.h dopo di esso.

In genere gli autori di qualsiasi libreria di codici risolvono i problemi di compatibilità ma possono farlo meglio se il loro codice è il primo a soddisfare il compilatore e il preprocessore.

C'è un problema simile con ACE, incluso ace/OS.h prima che qualcos'altro lo risolva.

+0

Ha funzionato! Grazie :) –

+0

Un'altra domanda: un'applicazione può leggere pacchetti con winsock2 da un'altra applicazione che invia pacchetti con winsock1? E viceversa. –

+0

@DainiusKreivys Non sono sicuro di quali aggiornamenti sono stati eseguiti da winsock1 a 2. Posso solo supporre che si tratti principalmente di correzioni di bug. Gli errori a parte tutto dovrebbe funzionare bene, ma dal momento che probabilmente ci sono bug, potrebbero venire fuori. – selalerer

10

Come Danius (PO) indica una compilazione con

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

riesce con questo errore:

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'altra parte

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

produce un mazzo di rumore e imposta la versione di Windows in modo errato

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

non riuscivo a trovare alcun modo per aggirare questo che non ha lasciato un cattivo sapore, ma questo:

#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 

effettivamente produca una compilazione pulita.

< Editoriale> Non dovrebbe essere così difficile </Editoriale>

7

Per me, invertire l'ordine delle comprende causato errori di compilazione con un altro Microsoft includono Stavo usando - che dichiarava le cose con "typedef interfaccia" .

Dal momento che il mio errore stava arrivando da socket_types.h, da queste righe:

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

ho messo un include di "Winsock2.h" prima della Windows.h, e poi finalmente la spinta/asio.hpp include, e le cose poi sono state compilate felicemente.

0
#ifdef BOOST_OS_WINDOWS 
#define _WIN32_WINNT 0x0501 
#if _WIN32_WINNT <= 0x0501 
#define BOOST_ASIO_DISABLE_IOCP 
#define BOOST_ASIO_ENABLE_CANCELIO 
#endif 
#endif 
+6

È considerata una buona forma per spiegare i tuoi suggerimenti/risposte. Le risposte al solo codice possono essere sorprendentemente disinformative, anche se tecnicamente corrette. –

0

Un altro workarround ho usato è di concentrare tutto il codice ASIO dipendente in un file di XXX.hpp e includerlo nella parte superiore di ogni finestra di applicazione di file XXX.cpp in cui si utilizza i suoi oggetti.

questo metodo inserisce l'inclusione sopra qualsiasi altro include windows.h e funziona intorno al problema.