2012-03-17 19 views
16

Mój projekt używa windows.h, w którym jest używany winsock.h, i muszę dodać boost: assio, który używa winsock2. Dostaję wiele błędów, które mówią, że Winsock.h jest już włączony. Potrafię zdefiniować WIN32_LEAN_AND_MEAN. aby windows.h nie używał winsock. Problem polega na tym, że potrzebuję Windowsa.h, aby go użyć, i potrzebuję Asio tylko do asynchronicznych timerów. Nie potrzebuję jego winsock2.h. Próbowałem wyszukać, jak wyłączyć jego użycie winsock2 i odkryłem, że mogę to zrobić, definiując BOOST_ASIO_NO_WIN32_LEAN_AND_MEAN przed włączeniem boost: asio, ale nadal otrzymuję ten sam błąd.Boost :: asio winsock i winsock 2 Problem zgodności

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

Błąd

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

Odpowiedz

16

spróbować zmienić kolejność lub zawiera. Zacznij od boost/asio.hpp i umieść po nim plik windows.h.

Zwykle programy piszące dowolnej biblioteki kodów rozwiązują problemy ze zgodnością, ale mogą zrobić to lepiej, jeśli ich kod jest pierwszym, który spełnia kompilator i preprocesor.

Istnieje podobny problem z ACE, w tym ace/OS.h, zanim cokolwiek innego go rozwiązuje.

+0

Zadziałało! Dzięki :) –

+0

Jeszcze jedno pytanie: Czy aplikacja może odczytywać pakiety z winsock2 z innej aplikacji, która wysyła pakiety z winsock1? I vice werset. –

+0

@DainiusKreivys Nie jestem pewien, jakie aktualizacje zostały wykonane od winsock1 do 2. Mogę się tylko domyślać, że to głównie poprawki błędów. Błędy odkładane na bok powinny działać poprawnie, ale ponieważ prawdopodobnie istnieją błędy, mogą pojawić się. – selalerer

10

Jak Danius (PO) wskazuje na kompilacji z

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

nie powiedzie się z tego błędu:

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 

Z drugiej strony

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

Produkuje kilka hałasu i ustawia wersję Windows # nieprawidłowo

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

nie mogłem znaleźć sposób wokół tego, że nie zostawił nieprzyjemny smak, ale w ten sposób:

#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 

przynosi czystą kompilacji.

< REDAKCJI> To nie powinno być trudne </Redakcyjne>

7

Dla mnie, przełączanie kolejności obejmuje spowodowane błędami kompilacji z innym Microsoft obejmują używałem - który został deklarowania rzeczy z „Interface” typedef .

Ponieważ mój błąd był pochodzący z socket_types.h z tych linii:

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

kładę include z "winsock2.h" przed windows.h, i wreszcie boost/asio.hpp obejmują, a następnie kompiluje się szczęśliwie.

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

To normalne, że dobrym pomysłem jest wyjaśnienie swoich sugestii/odpowiedzi. Odpowiedzi tylko na kod mogą być zaskakująco mało przydatne, nawet jeśli są poprawne technicznie. –

0

Innym workarround użyłem jest skoncentrowanie wszystkich asio zależną kod w pliku XXX.hpp i umieścić go na górze każdego okna wykonawczych plik XXX.cpp gdzie użyć swoich obiektów.

Ta metoda umieszcza plik asio powyżej dowolnego innego pliku windows.h i rozwiązuje ten problem.

Powiązane problemy