public inbox for cygwin@cygwin.com
 help / color / mirror / Atom feed
* Symbol visibility problems with -std=
       [not found] <CGME20200513102124eucas1p20b619bf7b82b386c66e935199790b2c1@eucas1p2.samsung.com>
@ 2020-05-13 10:21 ` Pavel Fedin
  2020-05-13 12:12   ` Marco Atzeri
  2020-05-13 14:08   ` Yaakov Selkowitz
  0 siblings, 2 replies; 4+ messages in thread
From: Pavel Fedin @ 2020-05-13 10:21 UTC (permalink / raw)
  To: cygwin

 Hello everyone!

 While compiling various software packages for Cygwin i notice that very often i have to add something like #define _GNU_SOURCE to
them in order to compile correctly. Meanwhile on Linux they compile with no problems at all. I've narrowed it down to -std=???
option using a simple test case:
--- cut test.cpp ---
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
        char *p = strdup("hello");

        printf("%s\n", p);
        free(p);
        return 0;
}
--- cut test.cpp ---

$ g++ test.cpp -o test - compiles OK
$ g++ test.cpp -o test -std=c++14 - error: 'strdup' was not declared in this scope; did you mean 'strcmp'?

 By printing out predefined macros (-dM -E) i found out that -std=something option adds " #define __STRICT_ANSI__ 1" to builtin
macros, but removes all *_SOURCE definitions, so _DEFAULT_SOURCE is not triggered any more.
 I've compared the behavior with Linux system. On Linux -std=c++14 also defines __STRICT_ANSI__, but various *_SOURCE macros are not
omitted.
 Isn't this a Cygwin bug? By the way, clang does not suffer from this problem.

Kind regards,
Pavel Fedin
Senior Engineer
Samsung Electronics Research center Russia



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Symbol visibility problems with -std=
  2020-05-13 10:21 ` Symbol visibility problems with -std= Pavel Fedin
@ 2020-05-13 12:12   ` Marco Atzeri
  2020-05-13 13:22     ` Csaba Ráduly
  2020-05-13 14:08   ` Yaakov Selkowitz
  1 sibling, 1 reply; 4+ messages in thread
From: Marco Atzeri @ 2020-05-13 12:12 UTC (permalink / raw)
  To: cygwin

Am 13.05.2020 um 12:21 schrieb Pavel Fedin via Cygwin:
>   Hello everyone!
> 
>   While compiling various software packages for Cygwin i notice that very often i have to add something like #define _GNU_SOURCE to
> them in order to compile correctly. Meanwhile on Linux they compile with no problems at all. I've narrowed it down to -std=???
> option using a simple test case:
> --- cut test.cpp ---
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> 
> int main(void)
> {
>          char *p = strdup("hello");
> 
>          printf("%s\n", p);
>          free(p);
>          return 0;
> }
> --- cut test.cpp ---
> 
> $ g++ test.cpp -o test - compiles OK
> $ g++ test.cpp -o test -std=c++14 - error: 'strdup' was not declared in this scope; did you mean 'strcmp'?
> 
>   By printing out predefined macros (-dM -E) i found out that -std=something option adds " #define __STRICT_ANSI__ 1" to builtin
> macros, but removes all *_SOURCE definitions, so _DEFAULT_SOURCE is not triggered any more.
>   I've compared the behavior with Linux system. On Linux -std=c++14 also defines __STRICT_ANSI__, but various *_SOURCE macros are not
> omitted.
>   Isn't this a Cygwin bug? By the way, clang does not suffer from this problem.
> 
> Kind regards,
> Pavel Fedin


strdup is an extension of C standard

so strictly behaviour of Cgywin is correct, see

  /usr/include/sys/features.h

for details




^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Symbol visibility problems with -std=
  2020-05-13 12:12   ` Marco Atzeri
@ 2020-05-13 13:22     ` Csaba Ráduly
  0 siblings, 0 replies; 4+ messages in thread
From: Csaba Ráduly @ 2020-05-13 13:22 UTC (permalink / raw)
  To: cygwin

On 13/05/2020 14:12, Marco Atzeri via Cygwin wrote:
> Am 13.05.2020 um 12:21 schrieb Pavel Fedin via Cygwin:
(snip code using strdup)
>> $ g++ test.cpp -o test - compiles OK
>> $ g++ test.cpp -o test -std=c++14 - error: 'strdup' was not declared in this 
>> scope; did you mean 'strcmp'?
>>
> 
> 
> strdup is an extension of C standard
> 
> so strictly behaviour of Cgywin is correct, see
> 
>   /usr/include/sys/features.h
> 
> for details

Pavel, you may want to try -std=gnu++14 instead.


Csaba
-- 
You can get very substantial performance improvements
by not doing the right thing. - Scott Meyers, An Effective C++11/14 Sampler
So if you're looking for a completely portable, 100% standards-conformat way
to get the wrong information: this is what you want. - Scott Meyers (C++TDaWYK)

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Symbol visibility problems with -std=
  2020-05-13 10:21 ` Symbol visibility problems with -std= Pavel Fedin
  2020-05-13 12:12   ` Marco Atzeri
@ 2020-05-13 14:08   ` Yaakov Selkowitz
  1 sibling, 0 replies; 4+ messages in thread
From: Yaakov Selkowitz @ 2020-05-13 14:08 UTC (permalink / raw)
  To: cygwin

On Wed, 2020-05-13 at 13:21 +0300, Pavel Fedin via Cygwin wrote:
>  While compiling various software packages for Cygwin i notice that very often i have to add something like #define _GNU_SOURCE to
> them in order to compile correctly. Meanwhile on Linux they compile with no problems at all. I've narrowed it down to -std=???
> option using a simple test case:
[snip]
> $ g++ test.cpp -o test - compiles OK
> $ g++ test.cpp -o test -std=c++14 - error: 'strdup' was not declared in this scope; did you mean 'strcmp'?
> 
>  By printing out predefined macros (-dM -E) i found out that -std=something option adds " #define __STRICT_ANSI__ 1" to builtin
> macros, but removes all *_SOURCE definitions, so _DEFAULT_SOURCE is not triggered any more.

That is what -std=c* is supposed to mean, that you are declaring strict
ISO-standard language conformance.

>  I've compared the behavior with Linux system. On Linux -std=c++14 also defines __STRICT_ANSI__, but various *_SOURCE macros are not
> omitted.

That's because _GNU_SOURCE is defined unconditionally by g++ on Linux,
which overrides the __STRICT_ANSI__ defined by -std=c*.  IIUC this is
done only to handle the use of non-ISO functions in libstdc++,
particularly in the implementation of newer C++ standards.

The bottom line is, if you are using POSIX C extensions, then you
shouldn't be declaring -std=c* without the appropriate _*_SOURCE.

>  Isn't this a Cygwin bug?

Not really, just that our g++ is somewhat more strict.  If anything,
allowing use of functions outside the declared standards (the behaviour
on Linux) is the bug, and it's been on my to-do list for a long time to
fix.  Fixing this isn't as simple as removing the unconditional define;
the C library functions used by newer C++ need to be appropriately
guarded, and then those specific guards used in libstdc++.  It was a
major project to get this working on Cygwin.

>  By the way, clang does not suffer from this problem.

Clang also defines _GNU_SOURCE unconditionally when compiling C++, even
on Cygwin.  Perhaps *that* should be considered the bug.

--
Yaakov



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-05-13 14:08 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <CGME20200513102124eucas1p20b619bf7b82b386c66e935199790b2c1@eucas1p2.samsung.com>
2020-05-13 10:21 ` Symbol visibility problems with -std= Pavel Fedin
2020-05-13 12:12   ` Marco Atzeri
2020-05-13 13:22     ` Csaba Ráduly
2020-05-13 14:08   ` Yaakov Selkowitz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).