Boost:: asio winsock и проблема с совместимостью winsock 2
В моем проекте используется windows.h, в котором используется winsock.h, и мне нужно включить boost: assio, который использует winsock2. Поэтому я получаю много ошибок, которые говорят, что Winsock.h уже включен.
Я могу определить WIN32_LEAN_AND_MEAN. так что windows.h не будет использовать winsock. Проблема в том, что мне нужен windows.h, чтобы использовать его, и мне просто нужен Asio для асинхронных таймеров. Мне не нужен его winsock2.h. Я попытался найти, как отключить его использование winsock2, и я обнаружил, что могу это сделать, определив BOOST_ASIO_NO_WIN32_LEAN_AND_MEAN, прежде чем включать boost: asio, но я все равно получаю ту же ошибку.
#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): фатальная ошибка C1189: #error: WinSock.h уже включен
Ответы
Ответ 1
Попробуйте изменить порядок или включить его. Начните с boost/asio.hpp и поставьте window.h после него.
Обычно авторы любой библиотеки кода решают проблемы совместимости, но они могут сделать это лучше, если их код первым встретит компилятор и препроцессор.
Там аналогичная проблема с ACE, включая ace/OS.h, прежде чем что-либо разрешит ее.
Ответ 2
Поскольку 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 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
Производит чистый компилятор.
<EDITORIAL> Не должно быть этого жесткого </EDITORIAL>
Ответ 3
Для меня, переключение порядка включений вызвало ошибки компиляции с другим Microsoft include, который я использовал, - это объявление вещей с помощью интерфейса typedef.
Поскольку моя ошибка исходила из socket_types.h, из этих строк:
# if defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_)
# error WinSock.h has already been included
# endif // defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_)
Я включил include winsock2.h перед Windows.h, а затем, наконец, boost/asio.hpp включил, а вещи затем скомпилировались с радостью.
Ответ 4
Другой рабочий стол, который я использовал, состоит в том, чтобы сконцентрировать все зависимые от asio
кода в файле XXX.hpp и включить его в начало каждого окна
XXX.cpp, где вы используете его объекты.
этот метод помещает include asio над любым другим включением windows.h и обходится вокруг проблемы.
Ответ 5
#ifdef BOOST_OS_WINDOWS
#define _WIN32_WINNT 0x0501
#if _WIN32_WINNT <= 0x0501
#define BOOST_ASIO_DISABLE_IOCP
#define BOOST_ASIO_ENABLE_CANCELIO
#endif
#endif