2

私はcythonでいくつかのPython拡張モジュールを書いています。私が書いた拡張機能はビルドされ、うまく機能します。次に、numpy配列にアクセスするときに、型付きのmemoryviewsを使用したいと思いました。これは、いくつかの利点があるように思われるためですhttp://docs.cython.org/src/userguide/memoryviews.html

ただし、cythonコードでmemoryviewを使用するとすぐに、拡張機能のビルド時にエラーが発生します。たとえば、このテスト行を追加すると、次のようになります。

cdef double [:、:: 1] X = np.zeros((100、100))

既存の動作中のcython拡張機能に。次のエラーが発生します。

C:\MinGW\bin\gcc.exe -shared -s build\temp.win32-2.7\Release\image_box.o build\temp.win32-2.7\Release\image_box.def -Lc:\python27\libs -Lc:\python27\PCbuild -lp
ython27 -lmsvcr90 -o x:\ARframework\python\image_ops\image_box.pyd
build\temp.win32-2.7\Release\image_box.o:image_box.c:(.text+0xe23): undefined reference to `___sync_fetch_and_add_4'
build\temp.win32-2.7\Release\image_box.o:image_box.c:(.text+0x3318): undefined reference to `___sync_fetch_and_add_4'
build\temp.win32-2.7\Release\image_box.o:image_box.c:(.text+0x4c81): undefined reference to `___sync_fetch_and_sub_4'
build\temp.win32-2.7\Release\image_box.o:image_box.c:(.text+0x4d37): undefined reference to `___sync_fetch_and_sub_4'
build\temp.win32-2.7\Release\image_box.o:image_box.c:(.text+0x10767): undefined reference to `___sync_fetch_and_sub_4'
build\temp.win32-2.7\Release\image_box.o:image_box.c:(.text+0x10793): undefined reference to `___sync_fetch_and_sub_4'
collect2.exe: error: ld returned 1 exit status
error: command 'gcc' failed with exit status 1

この投稿で提案されているように、gcc行に-march = i486を追加しようとしました: sync_fetch_and_add_4への未定義の参照です が、問題は解決しませんでした。さらに言えば、-march=i586と-march=pentiumも試しましたが成功しませんでした。

ここで何が起こっているのか分かりますか?

私のプラットフォームはWindows7、mingwバージョンは4.70、Cythonバージョンは0.17.1です。

ありがとう

4

1 に答える 1

3

私は解決策を見つけました。

実際、gccフラグ-march = i486は問題を解決します!ただし、コンソールでテストしたところ、リンクステップのgcc行に適用しただけで(エラーが発生しました)、問題が解決しなかったため、機能しないと思いました。実際、コンパイルとリンクの両方のステップで-march = i486を使用する必要があります。そうすれば、エラーは発生しなくなります。

拡張機能をビルドするときにこれらのフラグを含める方法については、追加しようとしました

import os
os.environ['LDFLAGS'] = '-march=i486'
os.environ['CFLAGS'] = '-march=i486'

setup.pyに追加しましたが、機能しなかったようです。

そこで、c:\ python27 \ Lib \ distutils \ cygwinccompiler.pyを変更して、コンパイルとリンクの手順にこれらのフラグを含めました。これがこれらのフラグを設定する非常に洗練された方法であるかどうかはわかりません。どんな選択肢も大歓迎です!

于 2012-10-08T01:33:10.357 に答える