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を使用しています
私は質問の一部に答えることができます、なぜあなたはメッセージを受け取っているのですか?.
ビルドプロセスの何かが、オプション_-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=メンテナは上記の情報を使用して、将来のリリースで問題を修正できます。
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})
-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'
)
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", "")
# ==================================
これは、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},
...
)
より具体的には、distutilsはpythonで作成されたのと同じオプションを使用します。extra_compile_args
を使用してdistutils.core.Extension
を作成するときにオプションを追加できますが、方法がないようですgccまたはdistutilsの既存の引数を削除します。
詳細は http://bugs.python.org/issue9031 を参照してください。これは http://bugs.python.org/issue1222585 の複製としてクローズされていますが、 9031はこの問題の側面を詳しく説明しています
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に適用しようとすると中止されます。解決策は、ブロック全体をコメント化することです。