I: gcc ... -U_WIN32 ... may cause problems
Michael Czapski
MCzapski@openplus.com.au
Thu Aug 27 05:54:00 GMT 1998
Hello All,
I am currently working on a 'source-portable' application, intended to run
natively under Win32, various flavours of Unix as well as OpenVMS. Usually I
develop using Microsoft Developer Studio (VC++ 5.0, Intel), re-build and test
under Cygwin32 B19.3 (EGCS 1.0.2), re-build and test on Linux (gcc 2.7.2,
Intel), re-build and test on OpenVMS/VAX 7.0 (DECC 5.5). This arrangements
allows me to conveniently test and resolve 'gross' portability issues. When I
am sufficiently far advanced with the project I will build the application on
DEC Unix, OpenVMS/AXP and, possibly, other platforms.
I use the same GNUmakefile for Cygwin32 and Linux (will use for other Unix(es)
as well). Since gcc under Cygwin32 does not pre-define "__unix__" or "__unix"
or "unix", as is the case under Linux, and in the Cygwin32/EGCS/gcc environment
_WIN32 is defined the same as in the MS VC++ environment I had to code
#if defined(_WIN32) && !defined(__CYGWIN32__) in a number of places. This was
required to ensure that Windows NT-specific service code is not compiled under
Cygwin32 but unix-specific daemon code is compiled instead, for example. To
avoid coding #if defined construct as shown I decided to undefine _WIN32 when
compiling in Cygwin32 environment by using a command line of a form "gcc ...
-U_WIN32 ...". Before I did that the application worked fine however as soon
as I did undefined _WIN32 it started to misbehave.
It turned out, after some investigations, that the 'stat' system call, which
worked fine with _WIN32 defined, no longer works and causes stack corruption
with the resulting SEGV. It turned out, after further investigation, that the
'missing' _WIN32 affects unistd.h header file. If _WIN32 is defined just prior
to #include <unistd.h> and undefined just after all is well otherwise the
problem repeats. It turned out, after further investigation, that
'__MS_types__' is defined in unistd.h and that this is what makes all the
difference.
Now I code that as:
#if defined(__CYGWIN32__) && !defined(_WIN32)
# define __MS_types__ /* this breaks stat function if not defined */
# define _MS_types_DEFINED /* at the time unistd.h is included */
#endif
#include <unistd.h>
#if defined(__CYGWIN32__) && defined(_MS_types_DEFINED)
# undef __MS_types__
# undef _MS_types_DEFINED
#endif
This way I avoid defining _WIN32, can safely (?) undefine _WIN32 and code on
the basis of 'if _WIN32 is not defined than it must be Unix or VMS' :-).
Since I found that workaround I stopped poking around to see what exactly
breaks the 'stat'. If anyone knows or finds out please let me know :-).
This message may, perhaps, save somebody a great deal of hassle in the future
:-)
Thanks Cygnus, Sergey and all other contributors for Cygwin32 and all related
bits.
------------------
Cheers ...
Michael Czapski
-
For help on using this list (especially unsubscribing), send a message to
"gnu-win32-request@cygnus.com" with one line of text: "help".
More information about the Cygwin
mailing list