cup c++ python gcc swig

c++ - swig cup



cc1plus: advertencia: la opción de línea de comando "-Wstrict-prototypes" es válida para Ada/C/ObjC pero no para C++ (7)

El siguiente fragmento de código en setup.py eliminará todas las instancias de este indicador molesto:

# 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", "") # ==================================

Estoy construyendo una extensión de C ++ para usar en Python. Veo que esta advertencia se genera durante el proceso de compilación, cuando un tipo:

python setup.py build_ext -i

¿Qué lo está causando y cómo lo arreglo?

Por cierto, aquí hay una copia de mi archivo de configuración:

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

Estoy usando gcc 4.4.3 en Ubuntu


Eliminar -Wstrict-prototipos de la variable de entorno OPT no tiene ningún efecto. Lo que funciona es subclase build_ext como sigue:

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)

y luego use my_build_ext dentro de la función de setup :

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


Esta es una solución de Python 3.x con 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}, ... )


Más específicamente, distutils usa las mismas opciones con las que Python fue creado, puedes agregar opciones usando extra_compile_args para crear distutils.core.Extension pero no parece haber una forma de eliminar los argumentos existentes en gcc o distutils.

Consulte http://bugs.python.org/issue9031 para obtener más información, se ha cerrado como un duplicado de http://bugs.python.org/issue1222585 , pero 9031 detalla este aspecto del problema


Por el bien de cualquiera que llegue aquí después de intentar instalar pydoop bajo pypy, esta solución que se adoptó en pydoop 1.0.0:

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

interrumpe la instalación en pypy porque pypy sysconfig no suministra la variable ''OPT'', lo que provoca que se aborte cuando intenta aplicar strip () en None. La solución es simplemente comentar todo el bloque.


Puedo responder parte de la pregunta, por qué recibes el mensaje.

Algo en su proceso de construcción es invocar a gcc en un archivo fuente de C ++ con la opción -Wstrict-prototypes . Para C y Objective-C, esto hace que el compilador advierta sobre las declaraciones de funciones de estilo antiguo que no declaran los tipos de argumentos.

Para C ++, esta opción no tiene sentido; tales declaraciones ni siquiera están permitidas por el idioma (los prototipos son obligatorios).

(No sé por qué el mensaje menciona a Ada; -Wstrict-prototypes tiene aún menos sentido para Ada que para C ++. No es un gran problema, pero he enviado este informe de error , marcado como RESUELTO / FIJO a partir de 2015- 12-06.)

La solución debería ser eliminar la opción -Wstrict-prototypes de la invocación de gcc. Pero como no estás invocando directamente a gcc, es difícil saber cómo hacerlo.

Pude reproducir la advertencia utilizando su setup.py , después de crear manualmente un archivo example_wrap.cxx falso:

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

Así que es probable que sea un error menor en build_ext de Python.

Pero como solo es una advertencia, no un error fatal, diría que puede ignorarlo sin peligro. gcc advierte sobre la opción sin sentido, pero luego simplemente la ignora.

EDITAR :

Mirando a través de las fuentes de Python-2.7.2, esta sección de configure.in podría ser la culpable:

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

(Supongo que se invoca cuando se utiliza build_ext ).

-Wstrict-prototypes opción -Wstrict-prototypes solo si el compilador no está siendo invocado como g++ , pero en su caso está usando el comando gcc para compilar el código fuente de C ++. Y en Lib/distutils/command/build_ext.py , build_extension() no presta atención al idioma del archivo fuente cuando invoca self.compiler.compile() , solo cuando invoca self.compiler.link_shared_object() . (Lo que parece extraño; para los compiladores que no sean gcc, no necesariamente podría usar el mismo comando para compilar C y C ++, y tiene más sentido usar el comando g++ todos modos, incluso si no está enlazando). )

ACTUALIZACIÓN: Se envió un informe de error de Python: https://bugs.python.org/issue9031 , y se cerró como un duplicado de este: https://bugs.python.org/issue1222585 , que todavía está abierto mientras escribo esto .

Pero como dije, es solo una advertencia y probablemente puedas ignorarlo sin peligro. Quizás los mantenedores de Python pueden usar la información anterior para solucionar el problema en una versión futura.


-Wstrict-prototypes opción de -Wstrict-prototypes es leída por los nombres de /usr/lib/pythonX.Y/config/Makefile como parte de la variable OPT. Parece un error, pero puede anularlo configurando os.environ[''OPT''] en su setup.py.

Aquí hay un código que no parece demasiado dañino:

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'' )