web-dev-qa-db-ja.com

cc1plus:警告:コマンドラインオプション "-Wstrict-prototypes"はAda / C / ObjCでは有効ですが、C ++では無効です

Pythonで使用するC++拡張機能を構築しています。タイプが次の場合、コンパイルプロセス中にこの警告が生成されます。

python setup.py build_ext -i

何が原因で、どうすれば修正できますか?

ところで、ここに私のセットアップファイルのコピーがあります:

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

Ubuntuでgcc 4.4.3を使用しています

38

私は質問の一部に答えることができます、なぜあなたはメッセージを受け取っているのですか?.

ビルドプロセスの何かが、オプション_-Wstrict-prototypes_を使用してC++ソースファイルでgccを呼び出しています。 CおよびObjective-Cの場合、これによりコンパイラーは、引数の型を宣言しない古いスタイルの関数宣言について警告します。

C++の場合、このオプションは意味がありません。そのような宣言は言語によっても許可されていません(プロトタイプは必須です)。

(メッセージにAdaが含まれている理由がわかりません。Adaの場合、_-Wstrict-prototypes_はC++よりも意味がありません。大きな問題ではありませんが、 (このバグレポート とマークされています) 2015年12月6日現在、解決済み/修正済み。)

解決策は、gccの呼び出しから_-Wstrict-prototypes_オプションを削除することです。しかし、gccを直接呼び出さないため、その方法を知ることは困難です。

ダミーの_setup.py_ファイルを手動で作成した後、_example_wrap.cxx_を使用して警告を再現できました:

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

したがって、これはおそらくPythonの_build_ext_のマイナーなバグです。

しかし、これは単なる警告であり、致命的なエラーではないので、無視してかまいません。 gccは無意味なオプションについて警告しますが、それを無視します。

[〜#〜]編集[〜#〜]

Python-2.7.2ソースを見ると、_configure.in_のこのセクションが原因である可能性があります。

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

(_build_ext_の使用時に呼び出されると想定しています。)

コンパイラが_-Wstrict-prototypes_として呼び出されているnotの場合にのみ、_g++_オプションをオンにしますが、C++をコンパイルするためにgccコマンドを使用していますソースコード。また、_Lib/distutils/command/build_ext.py_では、build_extension()を呼び出すときのみ、self.compiler.compile()を呼び出すときにself.compiler.link_shared_object()はソースファイルの言語に注意を払いません。 (奇妙に思われます。gcc以外のコンパイラでは、CとC++をコンパイルするために同じコマンドを使用できるとは限りません-とにかく_g++_コマンドを使用する方が理にかなっています再リンクしません。)

更新:A Pythonバグレポートが提出されました: https://bugs.python.org/issue9031 、そしてこれの複製として閉じられました: https://bugs.python.org/issue1222585 、これは私がこれを書いているときにまだ開いています。

しかし、先ほど述べたように、これは単なる警告であり、おそらく無視しても問題ありません。たぶん、Python=メンテナは上記の情報を使用して、将来のリリースで問題を修正できます。

39
Keith Thompson

OPT環境変数から-Wstrict-prototypesを削除しても効果はありません。機能するのは、次のように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)

次に、setup関数内でmy_build_extを使用します。

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

-Wstrict-prototypesオプションは、distutilsによって/usr/lib/pythonX.Y/config/MakefileからOPT変数の一部として読み取られます。ハックのようですが、setup.pyでos.environ['OPT']を設定することでオーバーライドできます。

以下は、害が少ないと思われるコードです。

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

Setup.pyの次のコードフラグメントは、この厄介なフラグのすべてのインスタンスを削除します。

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

これは、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):
        if '-Wstrict-prototypes' in self.compiler.compiler_so:
            self.compiler.compiler_so.remove('-Wstrict-prototypes')
        super().build_extensions()

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

より具体的には、distutilsはpythonで作成されたのと同じオプションを使用します。extra_compile_argsを使用してdistutils.core.Extensionを作成するときにオプションを追加できますが、方法がないようですgccまたはdistutilsの既存の引数を削除します。

詳細は http://bugs.python.org/issue9031 を参照してください。これは http://bugs.python.org/issue1222585 の複製としてクローズされていますが、 9031はこの問題の側面を詳しく説明しています

2
rolinger

Pypyの下にpydoopをインストールしようとした後にここに到着した人のために、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 sysconfigは 'OPT'変数をまったく提供しないため、pypyの下でのインストールが中断され、strip()をNoneに適用しようとすると中止されます。解決策は、ブロック全体をコメント化することです。

1
larpal