41311


次のCythonのドキュメントを参考にしながら、簡単なCythonコードを作り(.pyx)、コンパイルを試みましたが、『:hello.c:(.text+0x1721):
undefined reference to `_imp__PyErr_Format'』というようなエラーが複数行出て.pydファイルができません。  
ご教示をお願いいたします。

<http://omake.accense.com/static/doc-ja/cython/src/quickstart/build.html>

『python setup.py build_ext --inplace』を行うと、次のファイルは生成されます。  
hello.c  
build> temp.win-amd64-2.7> Release> hello.def  
build> temp.win-amd64-2.7> Release> hello.o

次の記事の方法も見たのですが、上手くいきませんでした。  
<https://stackoverflow.com/questions/6985109/how-to-compile-c-code-from-
cython-with-gcc>

環境は次の通りです。  
windows 10 Pro/ 64bit  
Python 2.7.14 ([MSC v.1500 64 bit (AMD64)] on win32)  
Cython version 0.27.3  
gcc 6.3.0  
C:\Python27\libs\libpython27.a は存在しています。  
環境変数(python系のパス)：  
PATH: c:\mingw\bin;C:\Python27;C:\Python27\Scripts  
(PYTHONPATHは設定していません)

今回、Cythonのために追加でインストールしたものは、Cythonとgcc(MinGW)になります。  
他に必要なモジュールなどありますでしょうか。

以上、よろしくお願いいたします。

==========追記です==========  
今回使用したコードは次の通りです。

[code]

    [setup.py]
    #! -*- coding: utf-8 -*-
    
    from distutils.core import setup
    from distutils.extension import Extension
    from Cython.Distutils import build_ext
    
    ext_modules = [Extension("hello", ["hello.pyx"])]
    
    setup(
      name = 'Hello world app',
      cmdclass = {'build_ext': build_ext},
      ext_modules = ext_modules
    )
    
[/code]

[code]

    [hello.pyx]
    def say_hello_to(name):
        print("Hello %s!" % name)
    
[/code]

上記二つのファイルを、同じフォルダ内に作り、cmdでそのディレクトリに移動し、『python setup.py build_ext
--inplace』を行いました。  
Cythonのドキュメント通りに作ったつもりですが、ご確認をお願いいたします。

(*上記追記内容を、回答欄に乗せてしまっていたのを、修正しました。ご迷惑をおかけいたしました。)

==========追記2==========  
下記サイトを参考に、2つの方法を試してみました。  
<https://stackoverflow.com/questions/35707191/compiling-pyx-files>

  1. `gcc -shared -Wall -O3 -I Python27/include -L Python27/libs -o fib.so fib.c -l python27`を使う方法  
上記コマンドを一部修正し、`gcc -shared -Wall -O3 -I C:\Python27\include -L C:\Python27\libs
-o hello.pyd hello.c -l
C:\Python27\libs\libpython27.a`のようにしてみたところ、`c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/bin/ld.exe:
cannot find -lC:\Python27\libs\libpython27.a collect2.exe: error: ld returned
1 exit status`と表示されました(※C:\Python27\libs\libpython27.aは存在しているのですが。。)  
`gcc -shared -Wall -O3 -I C:\Python27\include -L C:\Python27\libs -o hello.pyd
hello.c -l python27`だと、最初と同じエラーの`undefined reference to
_imp__PyErr_SetString`が表示されます。

  2. setup.pyを使う方法  
setup.pyをリンク先の回答のように書き直し、`python setup.py build_ext
--inplace`をすると下記のエラーが出ました。(今まででてこなかったエラーです)

running build_ext  
building 'hello' extension  
c:\mingw\bin\gcc.exe -mdll -O -Wall -IC:\Python27\include -IC:\Python27\PC -c
hello.cpp -o build\temp.win-amd64-2.7\Release\hello.o  
In file included from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\math.h:36:0,  
from C:\Python27\include/pyport.h:325,  
from C:\Python27\include/Python.h:58,  
from hello.cpp:17:  
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\cmath:1157:11: error: '::hypot' has
not been declared  
using ::hypot;  
^~~~~  
error: command 'c:\mingw\bin\gcc.exe' failed with exit status 1

一応、"hello.cpp"はできていますが、buildフォルダの中は空っぽです。

以上、進捗のご報告となります。


CC BY-SA 3.0
2018-01-29T05:37:43.230
41280
2018-01-30T01:59:01.580
2018-01-29T08:42:43.473
24908
24908
question
python cython
Cythonのコンパイルができません。


@Haruさんからの紹介サイトなどを参考に、解決いたしましたのでご報告いたします。

  1. 用意するスクリプト(.py, .pyx)は、初めに用意していたもので大丈夫でした。
[code]     [setup.py]

    #! -*- coding: utf-8 -*-
    
    from distutils.core import setup
    from distutils.extension import Extension
    from Cython.Distutils import build_ext
    
    ext_modules = [Extension("hello", ["hello.pyx"])]
    
    setup(
      name = 'Hello world app',
      cmdclass = {'build_ext': build_ext},
      ext_modules = ext_modules
    )
    
[/code]

[code]     [hello.pyx]

    def say_hello_to(name):
        print("Hello %s!" % name)
    
[/code]

下記2つの手順に沿って各種ソフトのインストールや設定を行った上で、上記二つのファイルを同じフォルダ内に作り、cmdでそのディレクトリに移動 &
`python setup.py build_ext -i --compiler=msvc -DMS_WIN64`を行いました。

  2. Cythonと[Microsoft Visual C++ Compiler for Python 2.7](https://www.microsoft.com/en-us/download/details.aspx?id=44266/%22Microsoft%20Visual%20C%20%20%20Compiler%20for%20Python%202.7%22)をインストール  
恐らくですが、"Visual C++
Compiler"を使用する場合はgcc(MinGW)のインストールは必要ないかもしれません。(私のマシンには、色々試しているうちにgcc(MinGW)が入ってしまっている環境になってしまっておりましたが)  
[こちらのサイトも参考に](https://blog.ionelmc.ro/2014/12/21/compiling-python-extensions-
on-
windows/%22%E3%81%93%E3%81%A1%E3%82%89%E3%81%AEURL%E3%82%82%E5%8F%82%E8%80%83%E3%81%AB%22)

  3. productdirを設定する  
[こちらのサイト](http://www.geocities.jp/penguinitis2002/computer/programming/Python/cython/cython.html)の、`Python
フォルダの "Lib\distutils\msvc9compiler.py" に設定を追記する`を参考に、  
`def find_vcvarsall(version):`関数の、  
`if not productdir or not os.path.isdir(productdir):`行の直前に、  
`productdir =
"C:\\Users\\(ユーザー名)\\AppData\\Local\\Programs\\Common\\Microsoft\\Visual C++
for Python\\9.0"`を追記する。

私が解決した手順は以上です。  
"Visual C++
Compiler"などのインストールなどは問題なくできていたようですが、手順3の"productdir"が設定しない限り、エラー(ツールが見つからない)で止まってしまうようです。

この度は、解決にご協力頂いた @Haru さんをはじめとする多くの皆様にお礼申し上げます。  
ありがとうございました。


CC BY-SA 3.0
2018-01-30T01:59:01.580
41311
2018-01-30T01:59:01.580
24908
41280
answer