Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++

Tags:

c++

python

gcc

swig

I am building a C++ extension for use in Python. I am seeing this warning being generated during the compilation process - when a type:

python setup.py build_ext -i 

What is causing it, and how do I fix it?

BTW, here is a copy of my setup file:

#!/usr/bin/env python      """     setup.py file for SWIG example     """      from distutils.core import setup, Extension       example_module = Extension('_foolib',                                sources=['example_wrap.cxx',                                          '../wrapper++/src/Foo.cpp'                                        ],                                libraries=["foopp"]                                )      setup (name = 'foolib',            version = '0.1',            author      = "Me, Myself and I",            description = """Example""",            ext_modules = [example_module],            py_modules = ["example"],            ) 

I am using gcc 4.4.3 on Ubuntu

like image 493
Homunculus Reticulli Avatar asked Nov 12 '11 17:11

Homunculus Reticulli


1 Answers

I can answer part of the question, why you're getting the message.

Something in your build process is invoking gcc on a C++ source file with the option -Wstrict-prototypes. For C and Objective-C, this causes the compiler to warn about old-style function declarations that don't declare the types of arguments.

For C++, this option doesn't make sense; such declarations aren't even allowed by the language (prototypes are mandatory).

(I don't know why the message mentions Ada; -Wstrict-prototypes makes even less sense for Ada than for C++. It's not a huge deal, but I've submitted this bug report, marked as RESOLVED/FIXED as of 2015-12-06.)

The solution should be to remove the -Wstrict-prototypes option from the invocation of gcc. But since you're not invoking gcc directly, it's difficult to know how to do that.

I was able to reproduce the warning using your setup.py, after manually creating a dummy example_wrap.cxx file:

% python setup.py build_ext -i running build_ext building '_foolib' extension gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c example_wrap.cxx -o build/temp.linux-i686-2.7/example_wrap.o cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++ ... 

So it's probably a minor bug in Python's build_ext.

But since it's only a warning, not a fatal error, I'd say you can safely ignore it. gcc warns about the meaningless option, but then it just ignores it.

EDIT:

Looking through the Python-2.7.2 sources, this section of configure.in might be the culprit:

case $GCC in yes)     if test "$CC" != 'g++' ; then         STRICT_PROTO="-Wstrict-prototypes"     fi 

(I'm assuming that's invoked when using build_ext.)

It turns on the -Wstrict-prototypes option only if the compiler is not being invoked as g++ -- but in your case it's using the gcc command to compile C++ source code. And in Lib/distutils/command/build_ext.py, build_extension() doesn't pay attention to the source file language when invoking self.compiler.compile(), only when invoking self.compiler.link_shared_object(). (Which seems odd; for compilers other than gcc, you wouldn't necessarily be able to use the same command to compile C and C++ -- and it makes more sense to use the g++ command anyway, even if you're not linking.)

UPDATE: A Python bug report was submitted: https://bugs.python.org/issue9031, and closed as a duplicate of this one: https://bugs.python.org/issue1222585, which is still open as I write this.

But as I said, it's only a warning and you can probably safely ignore it. Perhaps the Python maintainers can use the above information to fix the problem in a future release.

like image 89
Keith Thompson Avatar answered Sep 30 '22 19:09

Keith Thompson