Boost :: asio winsock и winsock 2 проблема совместимости - PullRequest
17 голосов
/ 17 марта 2012

Мой проект использует 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>

Error

1> c: \ program files \ boost \ boost_1_47 \ boost \ asio \ detail \ socket_types.hpp (22): фатальная ошибка C1189: #error: WinSock.h уже включен

Ответы [ 5 ]

21 голосов
/ 17 марта 2012

Попробуйте изменить порядок или включить.Начните с boost / asio.hpp и поместите windows.h после него.

Обычно разработчики любой библиотеки кода решают проблемы совместимости, но они могут сделать это лучше, если их код первым встречает компилятор и препроцессор.,

Существует аналогичная проблема с ACE, включая ace / OS.h, прежде чем что-либо еще решит ее.

10 голосов
/ 30 апреля 2013

Поскольку Даниус (ОП) указывает, что компиляция с

#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

Производит ли чистую компиляцию.

Это не должно быть так сложно

9 голосов
/ 25 апреля 2014

Для меня переключение порядка включений, вызванных ошибками компиляции, с другим включением Microsoft, которое я использовал, - которое объявляло вещи с помощью "typedef interface".

Так как моя ошибка исходила из socket_types.h, из этих строк:

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

Я поместил файл включения "winsock2.h" перед Windows.h, а затем, наконец, файл boost / asio.hpp, после чего все скомпилировалось счастливо.

0 голосов
/ 28 сентября 2017

Другой обходной путь, который я использовал, заключается в том, чтобы сконцентрировать весь asio-зависимый код в файле XXX.hpp и включить его в верхнюю часть каждого окна, реализующего файл XXX.cpp, где вы используете его объекты.

этот метод размещаетinclude asio над любым другим включением windows.h и обходят проблему.

0 голосов
/ 16 ноября 2016
#ifdef BOOST_OS_WINDOWS
#define _WIN32_WINNT 0x0501
#if _WIN32_WINNT <= 0x0501
#define BOOST_ASIO_DISABLE_IOCP
#define BOOST_ASIO_ENABLE_CANCELIO
#endif
#endif
...