43 votes

cc1plus : avertissement : l'option de ligne de commande "-Wstrict-prototypes" est valide pour Ada/C/ObjC mais pas pour C++

Je construis une extension C++ pour une utilisation en Python. Je vois cet avertissement généré pendant le processus de compilation - lorsqu'un type :

 python setup.py build_ext -i

Quelle en est la cause et comment y remédier ?

BTW, voici une copie de mon fichier d'installation :

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

J'utilise gcc 4.4.3 sur Ubuntu

24voto

Thrasibule Points 309

La suppression de -Wstrict-prototypes de la variable d'environnement OPT n'a aucun effet. Ce qui fonctionne, c'est de sous-classer build_ext comme suit :

 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)

puis utilisez my_build_ext dans la fonction setup :

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

14voto

subdir Points 591

-Wstrict-prototypes est lue par distutils à partir de /usr/lib/pythonX.Y/config/Makefile dans le cadre de la variable OPT. Cela semble bidon, mais vous pouvez le remplacer en définissant os.environ['OPT'] dans votre setup.py.

Voici un code qui ne semble pas trop nuisible :

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

13voto

Nimar Points 31

Le fragment de code suivant dans setup.py supprimera toutes les instances de cet indicateur embêtant :

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

10voto

Yan QiDong Points 111

Il s'agit d'une solution Python 3.x avec 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):
        if '-Wstrict-prototypes' in self.compiler.compiler_so:
            self.compiler.compiler_so.remove('-Wstrict-prototypes')
        super().build_extensions()

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X