This is the mail archive of the
cygwin
mailing list for the Cygwin project.
Re: C++11 program link failure under GCC 4.8.2-1
- From: Yucong Sun <sunyucong at gmail dot com>
- To: cygwin <cygwin at cygwin dot com>
- Date: Tue, 12 Nov 2013 15:51:00 -0800
- Subject: Re: C++11 program link failure under GCC 4.8.2-1
- Authentication-results: sourceware.org; auth=none
- References: <CAJygYd3KQEhdFBAYO4ONumf=FMvjH1fuiqa4b2F0XGLPBNv2Hw at mail dot gmail dot com> <52815780 dot 2010006 at gmail dot com> <528159F8 dot 2070307 at gmail dot com> <CAJygYd2H7tyjE73=EK2hdo2ZPvWtziU8sUkbgbo5crBtP3JRHQ at mail dot gmail dot com> <CAJygYd2UqXD3e-iguMUB1FUNDmCVmC5D7b1=zHqMVs1kJ8-+qw at mail dot gmail dot com> <5281F8D4 dot 4090809 at gmail dot com> <CAJygYd2TZkAnOFf67TEuQd0_V9Sgz8ZaZwVrVH6tusxRni-r3A at mail dot gmail dot com> <5282ABED dot 7040400 at gmail dot com> <5282BBCF dot 9040703 at cs dot utoronto dot ca>
That's what lead me to use gnu++0x instead.
For -rdynamic, apparently it would work for some simple c++ program,
just not those with new c++11 features. It would be nice to fix it.
Cheers.
On Tue, Nov 12, 2013 at 3:37 PM, Ryan Johnson
<ryan.johnson@cs.utoronto.ca> wrote:
> On 12/11/2013 5:30 PM, JonY wrote:
>>
>> On 11/13/2013 02:35, Yucong Sun wrote:
>>>
>>> Good new! I've found the link failure issue, it is caused by "-rdynamic"
>>>
>>> sunyc@sunyc-wks ~
>>> $ cat 2.cc
>>> #include <deque>
>>>
>>> struct tick_event {
>>> int i;
>>> };
>>>
>>> int main() {
>>> std::deque<tick_event *> list;
>>>
>>> tick_event *a = new tick_event;
>>> list.push_back(a);
>>> return 0;
>>> }
>>>
>>> sunyc@sunyc-wks ~
>>> $ g++ -c --std=c++11 -O3 -flto 2.cc -o 2.o
>>>
>>> sunyc@sunyc-wks ~
>>> $ g++ --std=c++11 -flto -D_GNU_SOURCE -rdynamic -fno-omit-frame-pointer
>>> -D_GNU_
>>> SOURCE -march=native -O3 2.o -o a
>>> Cannot export
>>> _ZNSt5dequeIP10tick_eventSaIS1_EE16_M_push_back_auxIJRKS1_EEEvDpOT
>>> _: symbol wrong type (4 vs 3)
>>> collect2: error: ld returned 1 exit status
>>>
>>>
>>> sunyc@sunyc-wks ~
>>> $ g++ --std=c++11 -flto -D_GNU_SOURCE -fno-omit-frame-pointer
>>> -D_GNU_SOURCE -ma
>>> rch=native -O3 2.o -o a
>>>
>>> sunyc@sunyc-wks ~
>>> $
>>>
>>> Hope it would help you nail the problem.
>>>
>> -rdynamic shouldn't do anything on Windows, I guess using ELF specific
>> arguments can break things.
>>>
>>> And Here's the test case for snprintf & c++11
>>>
>>> $ gcc -v
>>> Using built-in specs.
>>> COLLECT_GCC=gcc
>>>
>>> COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-pc-cygwin/4.8.2/lto-wrapper.exe
>>> Target: x86_64-pc-cygwin
>>> Configured with:
>>> /cygdrive/i/szsz/tmpp/cygwin64/gcc/gcc-4.8.2-1/src/gcc-4.8.2/co
>>> nfigure
>>> --srcdir=/cygdrive/i/szsz/tmpp/cygwin64/gcc/gcc-4.8.2-1/src/gcc-4.8.2 --
>>> prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin
>>> --libexecdi
>>> r=/usr/libexec --datadir=/usr/share --localstatedir=/var
>>> --sysconfdir=/etc --lib
>>> dir=/usr/lib --datarootdir=/usr/share --docdir=/usr/share/doc/gcc -C
>>> --build=x86
>>> _64-pc-cygwin --host=x86_64-pc-cygwin --target=x86_64-pc-cygwin
>>> --without-libico
>>> nv-prefix --without-libintl-prefix --enable-shared --enable-shared-libgcc
>>> --enab
>>> le-static --enable-version-specific-runtime-libs --enable-bootstrap
>>> --disable-__
>>> cxa_atexit --with-dwarf2 --with-tune=generic
>>> --enable-languages=c,c++,fortran,lt
>>> o,objc,obj-c++ --enable-graphite --enable-threads=posix
>>> --enable-libatomic --ena
>>> ble-libgomp --disable-libitm --enable-libquadmath
>>> --enable-libquadmath-support -
>>> -enable-libssp --enable-libgcj-sublibs --disable-java-awt
>>> --disable-symvers --wi
>>> th-ecj-jar=/usr/share/java/ecj.jar --with-gnu-ld --with-gnu-as
>>> --with-cloog-incl
>>> ude=/usr/include/cloog-isl --without-libiconv-prefix
>>> --without-libintl-prefix --
>>> with-system-zlib
>>> Thread model: posix
>>> gcc version 4.8.2 (GCC)
>>>
>>>
>>> sunyc@sunyc-wks ~
>>> $ cat 1.cc
>>> #include <stdio.h>
>>>
>>> int main() {
>>> char out[255];
>>> snprintf(out, sizeof(out), "%d", 1);
>>> return 1;
>>> }
>>>
>>> sunyc@sunyc-wks ~
>>> $ g++ --std=c++11 1.cc
>>> 1.cc: In function âint main()â:
>>> 1.cc:5:36: error: âsnprintfâ was not declared in this scope
>>> snprintf(out, sizeof(out), "%d", 1);
>>> ^
>>>
>>> sunyc@sunyc-wks ~
>>> $ g++ --std=gnu++0x 1.cc
>>>
>>> sunyc@sunyc-wks ~
>>> $ ls -lah a.exe
>>> -rwxr-xr-x 1 sunyc None 62K Nov 12 10:21 a.exe
>>>
>>> Cheers.
>>>
>> Right now, it is guarded by:
>> #if !defined(__STRICT_ANSI__) || (__STDC_VERSION__ >= 199901L)
>>
>> Which means non-strict mode and C99 mode, snprintf was not part of
>> C++03. I guess (__cplusplus >= 201103L) needs to be added to newlib.
>
> Yes, this has come up before [1]. Several *printf variants are affected
> IIRC.
>
> [1] http://cygwin.com/ml/cygwin/2012-04/msg00140.html
>
> Ryan
>
>
> --
> Problem reports: http://cygwin.com/problems.html
> FAQ: http://cygwin.com/faq/
> Documentation: http://cygwin.com/docs.html
> Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
>
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple