2012-03-17 92 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放在它後面。

通常,任何代碼庫的編寫者都會解決兼容性問題,但如果他們的代碼是第一個遇到編譯器和預處理器的話,他們可以做得更好。

ACE有類似的問題,包括ace/OS.h在解決它之前。

+0

它工作!謝謝:) – 2012-03-17 13:52:33

+0

還有一個問題:一個應用程序是否可以通過winsock2讀取數據包,從另一個應用程序發送數據包到winsock1?反之亦然。 – 2012-03-18 18:51:26

+0

@DainiusKreivys我不確定從winsock1到2的更新是什麼。我只能猜測它主要是bug修復。把蟲子放在一邊應該可以正常工作,但由於可能有蟲子,它們可能會出現。 – selalerer 2012-03-19 08:40:34

10

作爲Danius(該OP)指出與

#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_) 

我把一個包括「winsock2.h」的WINDOWS.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

這是一種很好的形式來解釋你的建議/答案。僅有代碼的答案可能會令人驚訝地無意義,即使它們在技術上是正確的。 – 2016-11-16 07:13:05

0

我使用的其他workarround是集中在XXX.hpp文件中的所有ASIO依賴 代碼,並將其包含在執行,你使用它的對象 XXX.cpp文件中的每個窗口的頂部。

該方法放置包含asio以上的任何其他包含windows.h和工作的問題。