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