2012-03-17 14 views
16

मेरा प्रोजेक्ट windows.h का उपयोग करता है जिसमें winsock.h का उपयोग किया जाता है, और मुझे बूस्ट शामिल करने की आवश्यकता है: assio जो winsock2 का उपयोग करता है। तो मुझे कई त्रुटियां मिलती हैं जो कहते हैं कि Winsock.h पहले से ही शामिल है। मैं WIN32_LEAN_AND_MEAN को परिभाषित कर सकता हूं। ताकि windows.h winsock का उपयोग नहीं करेगा। समस्या यह है कि मुझे इसका उपयोग करने के लिए windows.h की आवश्यकता है, और मुझे एसिओ सिंक्रोनस टाइमर के लिए बस चाहिए। मुझे इसकी winsock2.h की आवश्यकता नहीं है। मैंने अपने winsock2 उपयोग को अक्षम करने के तरीके की खोज करने का प्रयास किया, और मैंने पाया कि मैं बूस्ट सहित एओएसओ सहित BOOST_ASIO_NO_WIN32_LEAN_AND_MEAN को परिभाषित करके ऐसा कर सकता हूं, लेकिन मुझे अभी भी वही त्रुटि मिलती है।बूस्ट :: एएसआईओ विंसॉक और विंसॉक 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 डालें।

आमतौर पर किसी भी कोड लाइब्रेरी के लेखक संगतता के मुद्दों को हल करते हैं लेकिन यदि यह कोड संकलक और प्रीप्रोसेसर से मिलने वाला पहला कोड है तो वे इसे बेहतर कर सकते हैं।

किसी भी अन्य हल करने से पहले एसीई/ओएसएच सहित एसीई के साथ एक समान समस्या है।

+0

यह काम किया! धन्यवाद :) –

+0

एक और सवाल: क्या एक आवेदन किसी अन्य एप्लिकेशन चुड़ैल से winsock2 के साथ पैकेट पढ़ सकता है winsock1 के साथ पैकेट भेजता है? और उपाध्यक्ष। –

+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> 

पर शोर का एक समूह का उत्पादन और विंडोज संस्करण # गलत तरीके से सेट करता है

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 

एक साफ संकलन का उत्पादन करता है। कि "typedef इंटरफेस 'के साथ बातें की घोषणा की गई थी -

< संपादकीय> यह नहीं होना चाहिए कि कठिन </संपादकीय>

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.hpp फ़ाइल में प्रत्येक खिड़कियों को लागू करने XXX.cpp फ़ाइल जहाँ आप अपनी वस्तुओं का उपयोग की चोटी पर सभी asio निर्भर कोड ध्यान केंद्रित करने और इसे शामिल करने की है।

इस विधि में किसी अन्य के ऊपर एएसओ शामिल है जिसमें windows.h शामिल हैं और समस्या के आसपास काम करते हैं।

संबंधित मुद्दे