it-swarm.com.de

cc1plus: warning: Die Befehlszeilenoption "-Wstrict-Prototypen" ist für Ada/C/ObjC gültig, nicht jedoch für C++

Ich baue eine C++ - Erweiterung für Python. Diese Warnung wird während des Kompilierungsvorgangs generiert - wenn ein Typ:

python setup.py build_ext -i

Was verursacht es und wie kann ich es beheben?

Übrigens, hier ist eine Kopie meiner Setup-Datei:

#!/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"],
           )

Ich verwende gcc 4.4.3 auf Ubuntu

30

Ich kann einen Teil der Frage beantworten, warum Sie die Nachricht erhalten.

Etwas in Ihrem Build-Prozess ruft gcc für eine C++ - Quelldatei mit der Option -Wstrict-prototypes auf. Für C und Objective-C führt dies dazu, dass der Compiler vor Funktionsdeklarationen im alten Stil warnt, die nicht die Typen von Argumenten deklarieren.

Für C++ ist diese Option nicht sinnvoll. Solche Erklärungen sind von der Sprache nicht einmal erlaubt (Prototypen sind obligatorisch).

(Ich weiß nicht, warum in der Nachricht Ada erwähnt wird; -Wstrict-prototypes ist für Ada noch weniger sinnvoll als für C++. Es ist kein großer Deal, aber ich habe diesen Fehlerbericht vorgelegt, der ab 2015 als RESOLVED/FIXED gekennzeichnet ist -12-06.)

Die Lösung sollte darin bestehen, die -Wstrict-prototypes-Option vom Aufruf von gcc zu entfernen. Da Sie gcc jedoch nicht direkt aufrufen, ist es schwierig zu wissen, wie das geht.

Ich konnte die Warnung mit Ihrem setup.py reproduzieren, nachdem Sie eine Dummy-example_wrap.cxx-Datei manuell erstellt haben:

% 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++
...

Es ist also wahrscheinlich ein kleiner Fehler in Pythons build_ext.

Aber da dies nur eine Warnung und kein schwerwiegender Fehler ist, könnte ich sagen, dass Sie es ignorieren können. gcc warnt vor der sinnlosen Option, ignoriert sie jedoch einfach.

EDIT:

Wenn Sie die Quellen von Python-2.7.2 durchsehen, könnte dieser Abschnitt von configure.in der Täter sein: 

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

(Ich gehe davon aus, dass dies bei der Verwendung von build_ext aufgerufen wird.)

Die Option -Wstrict-prototypes wird nur aktiviert, wenn der Compiler nicht als g++ aufgerufen wird. In Ihrem Fall wird jedoch der Befehl gcc zum Kompilieren von C++ - Quellcode verwendet. In Lib/distutils/command/build_ext.py beachtet build_extension() beim Aufruf von self.compiler.compile() nicht die Sprache der Quelldatei, nur wenn self.compiler.link_shared_object() aufgerufen wird. (Was seltsam erscheint; für andere Compiler als gcc könnten Sie nicht unbedingt denselben Befehl zum Kompilieren von C und C++ verwenden - und es ist sinnvoller, den Befehl g++ zu verwenden, auch wenn Sie keine Verknüpfung herstellen. )

UPDATE: Ein Python-Fehlerbericht wurde eingereicht: https://bugs.python.org/issue9031 und als Duplikat dieses Berichts geschlossen: https://bugs.python.org/issue1222585 , das ist noch offen, während ich dies schreibe.

Aber wie gesagt, es ist nur eine Warnung und Sie können es wahrscheinlich ignorieren. Möglicherweise können die Python-Betreuer die obigen Informationen verwenden, um das Problem in einer zukünftigen Version zu beheben.

36
Keith Thompson

Das Entfernen von -Wstrict-Prototypen aus der Umgebungsvariable OPT hat keine Auswirkungen. Was funktioniert, ist die Unterklasse von build_ext wie folgt: 

from distutils.command.build_ext import build_ext
from distutils.sysconfig import customize_compiler

class my_build_ext(build_ext):
    def build_extensions(self):
        customize_compiler(self.compiler)
        try:
            self.compiler.compiler_so.remove("-Wstrict-prototypes")
        except (AttributeError, ValueError):
            pass
        build_ext.build_extensions(self)

und dann my_build_ext in der setup-Funktion verwenden: 

setup(cmdclass = {'build_ext': my_build_ext})
19
Thrasibule

Die -Wstrict-prototypes-Option wird von distutils aus /usr/lib/pythonX.Y/config/Makefile als Teil der OPT-Variablen gelesen. Es scheint hackig zu sein, aber Sie können es überschreiben, indem Sie os.environ['OPT'] in Ihrer setup.py einstellen.

Hier ist ein Code, der nicht zu schädlich scheint:

import os
from distutils.sysconfig import get_config_vars

(opt,) = get_config_vars('OPT')
os.environ['OPT'] = " ".join(
    flag for flag in opt.split() if flag != '-Wstrict-prototypes'
)
13
subdir

Das folgende Codefragment in setup.py entfernt alle Instanzen dieses pesky-Flag:

# Remove the "-Wstrict-prototypes" compiler option, which isn't valid for C++.
import distutils.sysconfig
cfg_vars = distutils.sysconfig.get_config_vars()
for key, value in cfg_vars.items():
    if type(value) == str:
        cfg_vars[key] = value.replace("-Wstrict-prototypes", "")
# ==================================
11
Nimar

Dies ist eine Python 3.x-Lösung mit Setuptools.

from setuptools import setup
from setuptools.command.build_ext import build_ext


# Avoid a gcc warning below:
# cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid
# for C/ObjC but not for C++
class BuildExt(build_ext):
    def build_extensions(self):
        self.compiler.compiler_so.remove('-Wstrict-prototypes')
        super(BuildExt, self).build_extensions()

setup(
    ...
    cmdclass={'build_ext': BuildExt},
    ...
)
6
Yan QiDong

Insbesondere verwendet distutils die gleichen Optionen, mit denen Python erstellt wurde. Sie können mit extra_compile_args beim Erstellen von distutils.core.Extension Optionen hinzufügen. Es scheint jedoch keine Möglichkeit zu geben, vorhandene Argumente in gcc oder distutils zu entfernen.

Siehe http://bugs.python.org/issue9031 für Details, es wurde als Duplikat von http://bugs.python.org/issue1222585 geschlossen, aber 9031 beschreibt diesen Aspekt des Problem

1
rolinger

Für jeden, der hierher gekommen ist, nachdem er versucht hat, pydoop unter pypy zu installieren, diese Lösung, die in pydoop 1.0.0 übernommen wurde:

from distutils.sysconfig import get_config_var
_UNWANTED_OPTS = frozenset(['-Wstrict-prototypes'])
os.environ['OPT'] = ' '.join(
    _ for _ in get_config_var('OPT').strip().split() if _ not in _UNWANTED_OPTS

bricht die Installation unter pypy ab, da pypy sysconfig die 'OPT' -Variable überhaupt nicht liefert, was dazu führt, dass sie abgebrochen wird, wenn strip () auf None angewendet wird. Die Lösung besteht nur darin, den gesamten Block auszukommentieren.

0
larpal