2012-03-17 45 views
16

Dự án của tôi sử dụng windows.h trong đó winsock.h được sử dụng và tôi cần bao gồm tăng: assio sử dụng winsock2. Vì vậy, tôi nhận được nhiều lỗi cho biết Winsock.h đã được bao gồm. Tôi có thể xác định WIN32_LEAN_AND_MEAN. để windows.h không sử dụng winsock. Vấn đề là, rằng tôi cần windows.h để sử dụng nó, và tôi chỉ cần Asio cho bộ đếm thời gian không đồng bộ. Tôi không cần winsock2.h của nó. Tôi đã thử tìm kiếm cách vô hiệu hóa việc sử dụng winsock2 của nó, và tôi thấy rằng tôi có thể làm điều đó bằng cách định nghĩa BOOST_ASIO_NO_WIN32_LEAN_AND_MEAN trước khi bao gồm boost: asio, nhưng tôi vẫn gặp lỗi tương tự.Boost :: asio winsock và winsock 2 vấn đề tương thích

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

Lỗi

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

Trả lời

16

Cố gắng và thay đổi thứ tự hoặc bao gồm. Bắt đầu với boost/asio.hpp và đặt windows.h sau nó.

Thông thường các nhà văn của bất kỳ thư viện mã nào giải quyết các vấn đề tương thích nhưng họ có thể làm tốt hơn nếu mã của họ là người đầu tiên gặp trình biên dịch và tiền xử lý.

Có vấn đề tương tự với ACE, bao gồm ace/OS.h trước khi bất kỳ điều gì khác giải quyết được.

+0

Đã hoạt động! Cảm ơn :) –

+0

Một câu hỏi nữa: Ứng dụng có thể đọc gói tin với winsock2 từ một ứng dụng phù thủy khác gửi gói tin với winsock1 không? Và ngược lại. –

+0

@DainiusKreivys Tôi không chắc chắn các bản cập nhật đã được thực hiện từ winsock1 đến 2. Tôi chỉ có thể đoán đó là chủ yếu là sửa lỗi. Bugs sang một bên tất cả mọi thứ sẽ làm việc ok, nhưng vì có lẽ có lỗi, họ có thể đi lên. – selalerer

10

Như Danius (OP) chỉ ra một biên dịch với

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

thất bại với lỗi này:

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 

Mặt khác

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

Tạo một loạt các tiếng ồn và đặt phiên bản cửa sổ # không chính xác

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

tôi không thể tìm thấy bất kỳ cách nào xung quanh này mà không để lại một hương vị xấu, nhưng điều này:

#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 

Liệu sản xuất một biên dịch sạch.

< BIÊN TẬP> Nó không nên là khó </BIÊN TẬP>

7

Đối với tôi, chuyển đổi thứ tự của bao gồm gây ra lỗi biên dịch với một Microsoft bao gồm Tôi đã sử dụng - đã được tuyên bố điều này với "typedef giao diện" .

Kể từ lỗi của tôi đến từ socket_types.h, từ những dòng này:

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

tôi đặt một bao gồm các "winsock2.h" trước khi windows.h, rồi cuối cùng là tăng/asio.hpp bao gồm, và mọi thứ sau đó được biên soạn một cách vui vẻ.

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

Đó là bình thường được coi là hình thức tốt để giải thích các đề xuất/câu trả lời của bạn. Các câu trả lời chỉ có mã có thể không đáng kể, ngay cả khi chúng đúng về mặt kỹ thuật. –

0

Một workarround khác mà tôi sử dụng là để tập trung tất cả ASIO phụ thuộc mã trong một tập tin XXX.hpp và bao gồm nó trên đỉnh của mỗi cửa sổ thực hiện tập tin XXX.cpp nơi bạn sử dụng đối tượng của nó.

phương pháp này đặt bao gồm asio lên trên bất kỳ cửa sổ nào khác bao gồm windows.h và công việc sẽ gây ra vấn đề.