c++ boost-asio winsock c-preprocessor winsock2

c++ - Boost:: Asio Winsock y WinSock 2 problema de compatibilidad



boost-asio c-preprocessor (5)

Mi proyecto usa windows.h en el que se usa winsock.h, y debo incluir boost: assio que usa winsock2. Así que recibo muchos errores que dicen que Winsock.h ya está incluido. Puedo definir WIN32_LEAN_AND_MEAN. para que windows.h no use winsock. El problema es que necesito windows.h para usarlo, y solo necesito Asio para los temporizadores asíncronos. No necesito su winsock2.h. Intenté buscar cómo deshabilitar su uso de winsock2, y descubrí que podía hacerlo definiendo BOOST_ASIO_NO_WIN32_LEAN_AND_MEAN antes de incluir boost: asio, pero aún así obtengo el mismo error.

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

Error

1> c: / archivos de programa / boost / boost_1_47 / boost / asio / detail / socket_types.hpp (22): error fatal C1189: #error: WinSock.h ya se ha incluido


Como Danius (el OP) señala una compilación con

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

falla con este error:

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

Por otra parte

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

Produce un montón de ruido y configura la versión de Windows # incorrectamente

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

No pude encontrar una forma de evitar esto que no dejara un mal sabor, pero esto:

#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

Produce una compilación limpia.

<EDITORIAL> No debería ser tan difícil </EDITORIAL>


Intenta y cambia el orden o incluye. Comience con boost / asio.hpp y coloque windows.h después.

Por lo general, los escritores de cualquier biblioteca de códigos resuelven los problemas de compatibilidad, pero pueden hacerlo mejor si su código es el primero en reunirse con el compilador y el preprocesador.

Hay un problema similar con ACE, incluido ace / OS.h antes de que cualquier otra cosa lo resuelva.


Otro entorno de trabajo que utilicé es concentrar todo el código dependiente de asio en un archivo XXX.hpp e incluirlo en la parte superior de cada ventana que implementa el archivo XXX.cpp en el que utiliza sus objetos.

este método coloca el include asio por encima de cualquier otro windows.hy trabajo alrededor del problema.


Para mí, cambiar el orden de las inclusiones incluyó errores de compilación con otra inclusión de Microsoft que estaba usando, eso fue declarar las cosas con la "interfaz typedef".

Dado que mi error provenía de socket_types.h, desde estas líneas:

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

Puse una inclusión de "winsock2.h" antes de Windows.h, y finalmente, el impulso / asio.hpp incluye, y las cosas se compilan alegremente.


#ifdef BOOST_OS_WINDOWS #define _WIN32_WINNT 0x0501 #if _WIN32_WINNT <= 0x0501 #define BOOST_ASIO_DISABLE_IOCP #define BOOST_ASIO_ENABLE_CANCELIO #endif #endif