2011-11-12 36 views
23

Pythonで使用するC++拡張機能をビルドします。私は、コンパイル処理中に生成され、この警告見ています - タイプ:cc1plus:警告:コマンドラインオプション "-Wstrict-prototypes"はAda/C/ObjCでは有効ですが、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の

答えて

31

上のgcc 4.4.3を使用しています私はなぜあなたがメッセージを取得している、質問の一部に答えることができます。

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

C++の場合、このオプションは意味がありません。そのような宣言は言語によっても許されません(プロトタイプは必須です)。メッセージはエイダを言及する理由

(私は知らない。-Wstrict-prototypesはC++よりもエイダのためにも、あまり意味がありますそれは大きな問題ではないのですが、私はthis bug reportを提出しましたが、/ 2015から12のような固定解決済みとしてマークされました。 -06)

解決策は、gccの呼び出しから-Wstrict-prototypesオプションを削除することです。しかし、gccを直接起動しているわけではないので、その方法を知ることは難しいです。

は私が手動でダミー example_wrap.cxxファイルを作成した後、あなたの setup.pyを使用して警告を再現することができました:

% 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は意味のないオプションについて警告しますが、無視するだけです。 EDIT

:Pythonの-2.7.2のソースを通じて探し

configure.inのこのセクションでは、犯人かもしれない:

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

(私はbuild_extを使用するときにそれが呼び出さだと仮定しています。)

コンパイラがでない場合にのみ、-Wstrict-prototypesオプションが有効になります。は、として呼び出されます。- あなたの場合は、gccコマンドを使用してC++ソースコードをコンパイルしています。 Lib/distutils/command/build_ext.pyでは、を呼び出すときには、self.compiler.link_shared_object()を呼び出すときにのみ、build_extension()はソースファイルの言語には注意しません。 (gcc以外のコンパイラでは、CとC++をコンパイルするのに同じコマンドを使用することは必ずしもできません。)

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

しかし、私が言ったように、それは唯一の警告であり、あなたはおそらくそれを無視することができます。多分、Pythonのメンテナーは上記の情報を使って、将来のリリースで問題を解決することができます。

+2

これはいくつかの素晴らしい精霊の狙撃です!それを嗅ぐことのおかげで、ありがとう。私はPythonのメンテナーにそれを提出します。 –

+0

@HomunculusReticulli:クール、あなたが得るフィードバックをここでフォローアップしてください。 –

+0

@HomunculusReticulli:参考、私は、このオプションがAdaに受け入れられているという事実についてgccに対するバグを報告しました(これは現在の質問に直接関係しません)。 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51115 –

1

具体的には、distutilsはpythonのビルドと同じオプションを使用します。の作成時にextra_compile_argsを使用してオプションを追加できますが、gccまたはdistutilsの既存の引数を削除する方法はありません。

問題のこの側面を、それがhttp://bugs.python.org/issue1222585の重複として閉じられた、詳細についてはhttp://bugs.python.org/issue9031を参照してください、しかし9031の詳細

12

-Wstrict-prototypesオプションは、OPT変数の一部として/usr/lib/pythonX.Y/config/Makefileからのdistutilsによって読み取られます。 hackishのようですが、あなたのsetup.pyにos.environ['OPT']を設定することでそれを上書きすることができます。誰のために

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

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

はあまりにも有害ではないと思われるコードがありますpydoopの下に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に適用しようとすると中断させます。解決策はブロック全体をコメントアウトすることです。

0

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

-Wstrict-prototypesをOPT環境変数から削除しても効果はありません。 setup関数内my_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(cmdclass = {'build_ext': my_build_ext}) 
+0

ありがとうございます。これは私が探していた命令でした。また、setuptools、fwiwで動作します。 –

0

これはsetuptoolsのではPython 3.xのソリューションであり、どのような作品は、次のようにbuild_extをサブクラス化することです。

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}, 
    ... 
) 
関連する問題