Ubuntu with cc1plus – error Not Implemented

g++gccrdkitUbuntu

I am trying to use the make command on Ubuntu 11.10, but get an error.

g++ -g -O2 -fPIC -fPIC -Wall -Wpointer-arith -Wendif-labels -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -g -fpic -Wno-deprecated -Wno-unused-function -I/usr/local/include -I/home/jochen/RDKit/Code -DRDKITVER='"004000"' -I/usr/local/include -I/home/jochen/RDKit/Code -DRDKITVER='"004000"' -I. -I. -I/usr/include/postgresql/9.1/server -I/usr/include/postgresql/internal -D_GNU_SOURCE -I/usr/include/libxml2 -I/usr/include/tcl8.5 -c -o adapter.o adapter.cpp

cc1plus: nicht implementiert: -fexcess-precision=standard for C++
make: * [adapter.o] Fehler 1

I have installed GCC, G++, and the build-essentials.

Output from gcc -v:

Es werden eingebaute Spezifikationen verwendet.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.6.1/lto-wrapper
Ziel: i686-linux-gnu
Konfiguriert mit: ../src/configure -v –with-pkgversion='Ubuntu/Linaro 4.6.1-9ubuntu3' –with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs –enable-languages=c,c++,fortran,objc,obj-c++,go –prefix=/usr –program-suffix=-4.6 –enable-shared –enable-linker-build-id –with-system-zlib –libexecdir=/usr/lib –without-included-gettext –enable-threads=posix –with-gxx-include-dir=/usr/include/c++/4.6 –libdir=/usr/lib –enable-nls –with-sysroot=/ –enable-clocale=gnu –enable-libstdcxx-debug –enable-libstdcxx-time=yes –enable-plugin –enable-objc-gc –enable-targets=all –disable-werror –with-arch-32=i686 –with-tune=generic –enable-checking=release –build=i686-linux-gnu –host=i686-linux-gnu –target=i686-linux-gnu
Thread-Modell: posix
gcc-Version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)

How can this be fixed?

Best Answer

gcc implements the -fexcess-precision option, but only for C.

The documentation for the option can be found here (search for -fexcess-precision) (this is the gcc 4.6.3 manual):

-fexcess-precision=style

This option allows further control over excess precision on machines where floating-point registers have more precision than the IEEE float and double types and the processor does not support operations rounding to those types.

[SNIP]

-fexcess-precision=standard is not implemented for languages other than C, and has no effect if -funsafe-math-optimizations or -ffast-math is specified. On the x86, it also has no effect if -mfpmath=sse or -mfpmath=sse+387 is specified; in the former case, IEEE semantics apply without excess precision, and in the latter, rounding is unpredictable.

You've told us that (a) you're compiling C++, (b) your script or Makefile uses -fexcess-precision, and (c) you can't change it. One of those has got to give. You have a bug in your script or Makefile, and you need to fix it.

Note that gcc probably should implement -fexcess-precision=standard for C++; as far as I know, C++ rules in this area are the same as C's and C requires this behavior for standard conformance. It's possible that your code depends on the behavior specified by -fexcess-precision=standard, and that gcc just doesn't support it. If that's the case, you've got a problem; it may be that the only way to work around it would be to make major modifications to your C++ source code. Or it may be that it implements the right behavior for C++; the manual isn't 100% clear on that point.

There is another possible workaround. You could write your own wrapper for the g++ command that invokes the real g++ command after deleting any occurrences of -fexcess-precision from its command line arguments. I've done something similar in the past, for a slightly different situation; you'd have to hack it to modify command-line arguments rather than filtering stderr. But I do not recommend this. The right solution is to fix the build script or Makefile -- assuming, again, that the program doesn't depend on the behavior specified by -fexcess-precision=standard.

Related Topic