через - cc1plus: warning: опция командной строки «-Wstrict-prototypes» действительна для Ada/C/ObjC, но не для C++




парсер командной строки c++ (5)

Я создаю расширение C ++ для использования в Python. Я вижу, что это предупреждение генерируется во время процесса компиляции - когда тип:

python setup.py build_ext -i

Что вызывает его, и как его исправить?

BTW, вот копия моего установочного файла:

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

Я использую gcc 4.4.3 на Ubuntu


Более конкретно, distutils использует те же возможности, с которыми был построен python, вы можете добавлять опции с помощью extra_compile_args при создании distutils.core.Extension но, похоже, не существует способа удалить существующие аргументы в gcc или distutils.

См. http://bugs.python.org/issue9031 для деталей, он был закрыт как дубликат http://bugs.python.org/issue1222585 , но 9031 детализирует этот аспект проблемы


Ради кого-либо, прибывающего сюда после попытки установить pydoop под pypy, это решение было принято в 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

ломает установку под pypy, потому что pypy sysconfig не передает переменную «OPT» вообще, вызывая ее прерывание при попытке применить strip () к None. Решение просто для того, чтобы прокомментировать весь блок.


Удаление -Wstrict-прототипов из переменной среды OPT не влияет. Что работает в подклассе build_ext следующим образом:

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)

а затем используйте my_build_ext внутри функции setup :

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

Это решение Python 3.x с 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},
    ...
)

-Wstrict-prototypes считывается distutils из /usr/lib/pythonX.Y/config/Makefile как часть переменной OPT. Это кажется хакерским, но вы можете переопределить его, установив os.environ['OPT'] в setup.py.

Вот код, который кажется не слишком вредным:

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




swig