2012-10-07 31 views
2

我一直在寫一些Python擴展模塊與用Cython。我編寫的擴展可以編譯並且工作良好。於是,我想用類型化memoryviews,訪問我的numpy的陣列時,他們看起來那麼我用memoryview我用Cython代碼構建擴展時,我會得到一個錯誤有如下幾個優點http://docs.cython.org/src/userguide/memoryviews.html用Cython:memoryview建立自己的錯誤使用MinGW

然而,一旦。例如,如果我添加此測試線:

CDEF雙[:, :: 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 

我試圖-march = 1486增加了一行gcc,因爲在這篇文章建議: undefined reference to sync_fetch_and_add_4 但這並沒有解決問題。對於這個問題,我也試過-march = i586和-march = pentium沒有成功。

任何想法這裏發生了什麼?

我的平臺是Windows 7,MinGW的版本是4.70,用Cython版本是0.17.1

感謝

+0

如果你使用,你必須適應新的或變化的方法。 def文件。這是最常被忽視的。只有在沒有'build \ temp.win32-2.7 \ Release \ image_box.o build \ temp.win32-2.7 \ Release \ image_box.def'的情況下才能進行測試。 –

+0

我不知道我明白你的意思。我已刪除的構建\ temp.win32-2.7 \發佈\ image_box.o構建\ temp.win32-2.7 \發佈\ image_box.def並嘗試重新建立延伸和問題仍然 – martinako

+0

嘗試建立與'C:\ MinGW的\ BIN \ gcc.exe -shared -s建立\ temp.win32-2.7 \發佈\ image_box.o -Lc:\ python27 \庫-Lc:\ python27 \ PCbuild -lp' –

回答

3

我找到了解決辦法。

實際上,GCC標誌-march = 1486不解決問題!但是,當我在控制檯中測試它時,我只是將它應用到鏈接步驟的gcc行(這是我得到錯誤的地方),因爲它沒有解決我認爲它不起作用的問題。 事實上,我需要在編譯和鏈接步驟中都使用-march = i486,然後再也沒有錯誤了。

至於如何當我建立擴展包括這些標誌,我試圖

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

添加到setup.py,但它似乎沒有工作。

所以我已經修改了C:\ python27 \ LIB \的distutils \ cygwinccompiler.py包括在編譯和鏈接步驟這些標誌。不知道這是否是設置這些標誌的非常優雅的方式。歡迎任何替代品!

+0

+1,你帶它運行。 –

相關問題