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.
signature.asc
Description: OpenPGP digital signature