On Thu, 15 Apr 2010, Eric Blake wrote: > On 04/15/2010 03:39 PM, Joel E. Denny wrote: > > % cat > tmp.cc > > #define __EXTENSIONS__ 1 > > #include <unistd.h> > > #include <getopt.h> > > % CC -I/opt/csw/include tmp.cc > > "/opt/csw/include/getopt.h", line 122: Error: Only one of a set of > > overloaded functions can be extern "C". > > 1 Error(s) detected. > > % CC -V > > CC: Sun C++ 5.9 SunOS_sparc Patch 124863-19 2009/12/02
> > The trouble is that, because of the __EXTENSIONS__ definition, > > /usr/include/unistd.h defines getopt with a different prototype than does > > /opt/csw/include/getopt.h. > > It would be helpful if you could show the getopt() declarations in both > headers, and enough context (like how __EXTENSIONS__ affects > <unistd.h>), for comparison. >From /usr/include/unistd.h: ------------------------------ #if defined(__STDC__) ... #if (defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 >= 4)) || \ defined(__EXTENSIONS__) extern int getopt(int, char *const *, const char *); ... #endif /* (defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 >= 4))... */ ... #else /* __STDC__ */ ... #if (!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || \ defined(_XPG4_2) || defined(__EXTENSIONS__) #if (defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 >= 4)) || \ defined(__EXTENSIONS__) extern int getopt(); ... #endif /* (defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 >= 4))... */ ... #endif /* (!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE))... */ ------------------------------ >From /opt/csw/include/getopt.h: ------------------------------ #if defined (__STDC__) && __STDC__ #ifdef __GNU_LIBRARY__ /* Many other libraries have conflicting prototypes for getopt, with differences in the consts, in stdlib.h. To avoid compilation errors, only prototype getopt for the GNU C library. */ extern int getopt (int argc, char *const *argv, const char *shortopts); #else /* not __GNU_LIBRARY__ */ extern int getopt (); #endif /* __GNU_LIBRARY__ */ ... #else /* not __STDC__ */ extern int getopt (); <---------- line 122, where the error is reported ... endif /* __STDC__ */ ------------------------------ To see why these headers select a different getopt prototype: % cat tmp.cc __STDC__ % CC -E tmp.cc #1 "tmp.cc" 0 In contrast: % g++ -E tmp.cc # 1 "tmp.cc" # 1 "<built-in>" # 1 "<command line>" # 1 "tmp.cc" 1 > Is there anything else in /opt/csw/include that Dago really wants to > use? He'll have to answer that. On Fri, 16 Apr 2010, Eric Blake wrote: > I've done some more testing. It turns out that gnulib _correctly_ > rejects /opt/csw/include/getopt.h as incompatible with the current > compiler, But CC reports the error as being in that file. > if you use autoconf 2.64 (prior to that, if the existence and > compilation checks disagree, autoconf went with the existence check). We are using autoconf 2.65. > The errors I'm seeing are due to the fact that Dagobert is using CC, not > cc To be clear, Dago is simply running the bison test suite, which requires a C++ compiler. > So I'm working on some patches to allow clean C++ compilation of getopt > (even if they won't be accepted upstream in glibc); and with luck, that > will also fix Dagobert's problem with CC. I updated gnulib to 2f3175, but the failure remains the same for bison. Is there any more information we can provide? Thanks.