Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Подключить boost/asio.hpp


Автор: polin11 3.12.2019, 12:10
ОС W10 QtCreator(СМake) компилятор Clang
подключаю заголовочный файл
#include <boost/asio.hpp>
падают ошибки при компиляции типа: 
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\shared\ws2def.h:235: ошибка: redefinition of 'sockaddr'
typedef struct sockaddr {
C:\.conan\kzey4w\1\include\boost\asio\detail\socket_types.hpp:24: ошибка: WinSock.h has already been included
#  error WinSock.h has already been included

Для исправления проблемы предлагают добавить 
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#endif
дефайн WIN32_LEAN_AND_MEAN означает, что будут отброшены большинство редко используемых функций, макросов и типов Windows.

Вопрос: кто-нибудь знает, как подключить boost/asio.hpp не используя #define WIN32_LEAN_AND_MEAN?    

Автор: mabrarov 3.12.2019, 13:44
Версия Boost?

Мой опыт - всегда определять WIN32_LEAN_AND_MEAN на уровне сриптов сборки / проекта для С/C++-кода под Windows. Например, глобально для всех модулей CMake-проекта или вот так (в каждый модуль CMake-проекта) - https://github.com/mabrarov/asio_samples/blob/master/cmake/internal_utils.cmake#L205 и https://github.com/mabrarov/asio_samples/blob/master/examples/ma_echo_server/CMakeLists.txt
Код

function(ma_config_public_compile_definitions result)
    set(compile_definitions )
    # Additional preprocessor definitions for Windows target
    if(WIN32)
        list(APPEND compile_definitions
            WIN32
            WIN32_LEAN_AND_MEAN
            WINVER=0x0501
            _WIN32_WINNT=0x0501
            _WIN32_WINDOWS=0x0501
            _WIN32_IE=0x0600
            _UNICODE
            UNICODE
            _WINSOCK_DEPRECATED_NO_WARNINGS)
    endif()
    # If using Intel C++ Compiler with Visual Studio
    if(MSVC AND (${CMAKE_CXX_COMPILER_ID} STREQUAL "Intel"))
        # If Intel C++ Compiler 16.0 and Visual Studio 2015+
        if((CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "16") AND ((MSVC_VERSION EQUAL 1900) OR (MSVC_VERSION GREATER 1900)))
            # Apply fix decribed at https://software.intel.com/en-us/articles/limits1120-error-identifier-builtin-nanf-is-undefined
            list(APPEND compile_definitions
                "__builtin_huge_val()=HUGE_VAL"
                "__builtin_huge_valf()=HUGE_VALF"
                "__builtin_nan=nan"
                "__builtin_nanf=nanf"
                "__builtin_nans=nan"
                "__builtin_nansf=nanf")
        endif()
    endif()
    set(${result} "${compile_definitions}" PARENT_SCOPE)
endfunction()
...
project(ma_echo_server)
...
ma_config_public_compile_definitions(cxx_public_compile_definitions)
ma_config_private_compile_options(cxx_private_compile_options)
...
add_executable(${PROJECT_NAME}
    ${cxx_headers}
    ${cxx_sources})
...
target_compile_definitions(${PROJECT_NAME}
    PUBLIC
    ${cxx_public_compile_definitions}
    PRIVATE
    ${cxx_private_compile_definitions})

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)