2016-10-25 9 views
0

私はCプログラムのためのpython拡張を作成しました。 Linuxでは、gccのを使用して、すべてが正常に動作し、拡張子はタイピングインストールすることができます:私はOS Xでそれを使用しようとするとOS X用openmp付きPython C拡張

sudo python setup.py install

しかし:

GCC 4.7:

macportsを使ってgcc 4.9をインストールしました。この行をsetup.pyファイルに追加しました。

import os 
os.environ["CC"]="gcc-mp-4.9" 

そして、私はsudo python setup.py install

を入力するとき、私はこのエラーを取得:

unrecognized command line option '-Wshorten-64-to-32' 

私は解決策を探していると誰もがその問題を解決するために、「GCCの代わりに打ち鳴らすを使用してください」と言います。

クラン3.8:

import os 
os.environ["CC"]="clang-mp-3.8" 
:私も打ち鳴らす3.8(3.5はOS Xにインストールされているが、それは、OpenMPを持っていない)と私は、ファイルsetup.pyを変更したインストールされている

そして、私はこのエラーを取得:

unknown argument: '-mno-fused-madd' 

私はCFLAGSのために空の値を設定し、この問題の可能な解決策を発見したいくつかのフォーラムでは:

sudo CFLAGS="" python setup.py install

は、しかし、私は新しいエラー得る:

library not found for -lgomp 

私は-fopenmp使用しますが-fgompが呼び出された理由を私はしないでください。いくつかのフォーラムでは、clangの代わりにgccを使う必要があると言うので、私は再び出発点にいます。

私は誰でも簡単にインストールできる拡張機能を作成したいので、OS Xでこの拡張機能を簡単にisntallするための解決策を見つけたいと思います。

答えて

1

私は同様の問題がありました。 Pythonは打ち鳴らすで構築されたと打ち鳴らす固有のCFLAGSを使用している:

>>> import sysconfig 
>>> sysconfig.get_config_var("CFLAGS") 
'-fno-strict-aliasing -fno-common -dynamic -arch x86_64 
-arch i386 -g -Os -pipe -fno-common -fno-strict-aliasing 
-fwrapv -DENABLE_DTRACE -DMACOSX -DNDEBUG -Wall 
-Wstrict-prototypes -Wshorten-64-to-32 -DNDEBUG -g 
-fwrapv -Os -Wall -Wstrict-prototypes -DENABLE_DTRACE' 

のDistutilsコピー拡張子を作るために使用される「UnixCCCompiler」インスタンスに、この情報を、。しかし、あなたが知ったように、-Wshorten-64-to-32はclang特有のものです。

私の解決策は、distutilsが拡張機能を構築する方法を変更することでした。以下では、実際のコンパイルコードを呼び出す前にコンパイラに渡すために、そのオプションをコマンドライン引数のリストから削除します。 (あなたは複雑すぎる必要はないかもしれませんが、私はいくつかのコンパイラと設定をサポートしています。)

def _is_gcc(compiler): 
    return "gcc" in compiler or "g++" in compiler 

class build_ext_subclass(build_ext): 
    def build_extensions(self): 
     c = self.compiler.compiler_type 
     if c == "unix": 
      compiler_args = self.compiler.compiler 
      c = compiler_args[0] # get the compiler name (argv0) 
      if _is_gcc(c): 
       names = [c, "gcc"] 
       # Fix up a problem on older Mac machines where Python 
       # was compiled with clang-specific options: 
       # error: unrecognized command line option '-Wshorten-64-to-32' 
       compiler_so_args = self.compiler.compiler_so 
       for args in (compiler_args, compiler_so_args): 
        if "-Wshorten-64-to-32" in args: 
         del args[args.index("-Wshorten-64-to-32")] 

     build_ext.build_extensions(self) 

次に拡張機能を構築するために、この新しいサブクラスを使用するように()の設定を教えて:

setup(name = ... 
     cmdclass = {"build_ext": build_ext_subclass}, 
    ) 
関連する問題