Fix configure failure on 32-bit MSVC.

Windows libraries being checked (ws2_32, rpcrt4, iphlpapi) contain functions following stdcall convention. While on 64-bit platform it makes no difference, on 32-bit it does. For example, function WSAGetLastError is mangled by MSVC like "_WSAGetLastError@0". CMake checks if a function FUNC is present in a library by compiling a simple C source containing function definition "char FUNC()" and then calling it. Since stdcall functions are mangled in such a way that requires correct number of arguments (written after "@"), checking for a function with non-zero number of arguments will fail.
That is why we check for functions which have zero arguments and we also force stdcall convention.
This commit is contained in:
Artem Martynovich 2015-09-11 13:39:19 +05:00
parent 759790cadc
commit 279bcb2843

View File

@ -117,10 +117,15 @@ check_include_files(windows.h ZMQ_HAVE_WINDOWS)
check_include_files(sys/uio.h ZMQ_HAVE_UIO) check_include_files(sys/uio.h ZMQ_HAVE_UIO)
check_include_files(sys/eventfd.h ZMQ_HAVE_EVENTFD) check_include_files(sys/eventfd.h ZMQ_HAVE_EVENTFD)
check_library_exists(ws2_32 WSAStartup "" HAVE_WS2_32) if(MSVC)
check_library_exists(ws2 WSAStartup "" HAVE_WS2) # Force stdcall convention
check_library_exists(rpcrt4 UuidCreate "" HAVE_RPCRT4) set(CMAKE_REQUIRED_FLAGS "/Gz")
check_library_exists(iphlpapi GetNetworkParams "" HAVE_IPHLAPI) endif()
check_library_exists(ws2_32 WSAGetLastError "" HAVE_WS2_32)
check_library_exists(ws2 WSAGetLastError "" HAVE_WS2)
check_library_exists(rpcrt4 RpcErrorClearInformation "" HAVE_RPCRT4)
check_library_exists(iphlpapi GetAdapterOrderMap "" HAVE_IPHLAPI)
unset(CMAKE_REQUIRED_FLAGS)
check_cxx_symbol_exists(SO_PEERCRED sys/socket.h ZMQ_HAVE_SO_PEERCRED) check_cxx_symbol_exists(SO_PEERCRED sys/socket.h ZMQ_HAVE_SO_PEERCRED)
check_cxx_symbol_exists(LOCAL_PEERCRED sys/socket.h ZMQ_HAVE_LOCAL_PEERCRED) check_cxx_symbol_exists(LOCAL_PEERCRED sys/socket.h ZMQ_HAVE_LOCAL_PEERCRED)