2012-03-17 4 views
16

내 프로젝트는 winsock.h가 사용되는 windows.h를 사용하며 winsock2를 사용하는 boost : assio를 포함해야합니다. 따라서 Winsock.h가 이미 포함되었다는 많은 오류가 발생합니다. WIN32_LEAN_AND_MEAN을 정의 할 수 있습니다. 그래서 windows.h는 winsock을 사용하지 않을 것입니다. 문제는, 내가 그것을 사용하는 windows.h가 필요하고 Asio가 비동기 타이머에만 필요하다는 것입니다. 나는 그 winsock2.h 필요 없어. winsock2 사용을 해제하는 방법을 검색해 보았는데 boost : asio를 포함하기 전에 BOOST_ASIO_NO_WIN32_LEAN_AND_MEAN을 정의하여이를 수행 할 수 있음을 발견했지만 여전히 동일한 오류가 발생합니다.Boost :: asio winsock 및 winsock 2 호환성 문제

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

오류

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

답변

16

시도하고 순서를 변경하거나 포함되어 있습니다. boost/asio.hpp로 시작하고 그 후에 windows.h를 입력하십시오.

일반적으로 모든 코드 라이브러리의 작성자는 호환성 문제를 해결하지만 코드가 컴파일러와 선처리 프로세서를 처음으로 충족시키는 경우 더 잘 수행 할 수 있습니다.

에이스/OS.h를 포함한 다른 문제가 해결되기 전에 ACE와 비슷한 문제가 있습니다.

+0

효과가 있습니다. 감사합니다 :) –

+0

한 가지 더 질문 : 다른 응용 프로그램 마녀가 winsock1을 사용하여 패킷을 보내는 응용 프로그램이 winsock2를 사용하여 패킷을 읽을 수 있습니까? 그리고 부절입니다. –

+0

@DainiusKreivys winsock1에서 2로 업데이트 한 내용이 확실하지 않습니다. 주로 버그 픽스였습니다. 버그는 모든 것을 제쳐두고 잘 수행해야하지만 버그가있을 수 있기 때문에 발생할 수 있습니다. – selalerer

10

Danius (영업 이익)은

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

와 컴파일 지적이 오류와 함께 실패로 :

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 

반면

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

에 소음의 무리를 생성 Windows 버전 #을 잘못 설정합니다.

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

내가 나쁜 맛을두고 있지 않습니다 주위에 어떤 방법을 찾을 수 있지만,이 :

#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 

깨끗한 컴파일을 생산 않습니다. "형식 정의 인터페이스"와 일을 선언 한 그 -

< 사설> 그것은 나를 위해 하드 </사설>

7

가 다른 마이크로 소프트와 컴파일 오류가 발생 포함의 순서를 전환하는 것을 안 내가 사용되었다 포함 .

내 오류가이 라인에서, socket_types.h에서 오는 이후 :

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

는 내가 마지막으로하고있는 Windows.h 전에 "winsock2.h"및 부스트/asio.hpp의 포함 넣어 포함하고, 그 다음 행복하게 모은 것들.

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

귀하의 제안/해답을 설명하는 것이 정상적인 방법으로 간주됩니다. 코드 만의 답은 비록 기술적으로 정확하더라도 놀라 울 정도로 정보가 없습니다. –

0

내가 사용되는 다른 workarround 당신은 그것의 개체를 사용 XXX.cpp 파일을 구현하는 각 윈도우의 상단에 그것을 XXX.hpp 파일의 모든 ASIO 의존 코드를 집중 포함하는 것입니다.

이 방법은 다른 모든 포함 windows.h 위에 include asio를 배치하고 문제를 해결합니다.