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