Discussion:
Conflict between standard headers and winsock(2).h
Marko Lindqvist
2016-01-22 11:33:07 UTC
Permalink
When building a project on MSYS2 environment, my configure fails to
find out that the winsock2.h is available there.
Simple AC_CHECK_HEADER() for winsock2.h fails, and so would many
standard macros if it was to be included. The reason for that failure
is that while the standard headers (unistd.h in my case, though itself
included from the very first stdio.h include already) are protected
against conflicts with winsock stuff, they can do that only if they
are included after winsock2.h.

With a local macro I've confirmed that prepending '#include
<winsock2.h>" to $ac_includes_default, when possible, does fix this.
At least all the macros I were interested about were behaving
correctly after that. Of course I have to call that macro of mine as
early as possible so that it won't invalidate any tests that have been
run on the assumption that <winsock2.h> is not included in the
beginning.

Is there more proper way to achieve this than directly prepending
$ac_includes_default, or is there any plans for such support?


- ML
Marko Lindqvist
2018-03-20 13:42:39 UTC
Permalink
Post by Marko Lindqvist
When building a project on MSYS2 environment, my configure fails to
find out that the winsock2.h is available there.
Simple AC_CHECK_HEADER() for winsock2.h fails, and so would many
standard macros if it was to be included. The reason for that failure
is that while the standard headers (unistd.h in my case, though itself
included from the very first stdio.h include already) are protected
against conflicts with winsock stuff, they can do that only if they
are included after winsock2.h.
With a local macro I've confirmed that prepending '#include
<winsock2.h>" to $ac_includes_default, when possible, does fix this.
At least all the macros I were interested about were behaving
correctly after that. Of course I have to call that macro of mine as
early as possible so that it won't invalidate any tests that have been
run on the assumption that <winsock2.h> is not included in the
beginning.
Is there more proper way to achieve this than directly prepending
$ac_includes_default, or is there any plans for such support?
The macro I'm using meanwhile:
https://github.com/freeciv/freeciv/blob/master/m4/winsock2.m4


- ML
Peter Rosin
2018-08-21 15:00:07 UTC
Permalink
Post by Marko Lindqvist
When building a project on MSYS2 environment, my configure fails to
find out that the winsock2.h is available there.
Simple AC_CHECK_HEADER() for winsock2.h fails, and so would many
standard macros if it was to be included. The reason for that failure
is that while the standard headers (unistd.h in my case, though itself
included from the very first stdio.h include already) are protected
against conflicts with winsock stuff, they can do that only if they
are included after winsock2.h.
With a local macro I've confirmed that prepending '#include
<winsock2.h>" to $ac_includes_default, when possible, does fix this.
At least all the macros I were interested about were behaving
correctly after that. Of course I have to call that macro of mine as
early as possible so that it won't invalidate any tests that have been
run on the assumption that <winsock2.h> is not included in the
beginning.
Is there more proper way to achieve this than directly prepending
$ac_includes_default, or is there any plans for such support?
I have used something like the following for this situation:

AC_CHECK_HEADERS([ \
foo1.h \
foo2.h \
etc.h \
windows.h \
winsock2.h \
winsock.h \
ws2tcpip.h \
shlobj.h \
wspiapi.h \
], [], [], [
AC_INCLUDES_DEFAULT
#define WIN32_LEAN_AND_MEAN
#ifdef HAVE_WINDOWS_H
#include <windows.h>
#endif
#ifdef HAVE_WINSOCK2_H
#include <winsock2.h>
#endif
#ifdef HAVE_WINSOCK_H
#include <winsock.h>
#endif
])

In practice, I'm sure you can skip winsock.h and I'm not sure this
solves your problem, but you might be able to adapt it...

Cheers,
Peter

Loading...