cython: ошибка сборки memoryview с mingw

Я писал несколько модулей расширения Python с помощью Cython. Написанные мной расширения хорошо работают. Затем я хотел использовать типизированные представления памяти при доступе к моим массивам numpy, поскольку они, похоже, имеют несколько преимуществ http://docs.cython.org/src/userguide/memoryviews.html

Однако, как только я использую memoryview в своем коде Cython, я получаю сообщение об ошибке при создании расширения. Например, если я добавлю эту тестовую строку:

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

Я попытался добавить -march = i486 в строку gcc, как предлагается в этом сообщении: неопределенная ссылка на sync_fetch_and_add_4, но это не решило проблему. В этом отношении я также безуспешно пробовал -march = i586 и -march = pentium.

Есть идеи, что здесь происходит?

Моя платформа - Windows 7, версия mingw - 4.70, версия Cython - 0.17.1

Спасибо


person martinako    schedule 07.10.2012    source источник
comment
Если вы используете новые или изменяете методы, вам необходимо адаптировать свой. def файл. Чаще всего на это не обращают внимания. Только для проверки попробуйте без build\temp.win32-2.7\Release\image_box.o build\temp.win32-2.7\Release\image_box.def.   -  person moskito-x    schedule 08.10.2012
comment
Я не уверен, что понимаю, что вы имеете в виду. Я удалил build \ temp.win32-2.7 \ Release \ image_box.o build \ temp.win32-2.7 \ Release \ image_box.def и снова пытаюсь создать расширение, но проблема остается   -  person martinako    schedule 08.10.2012
comment
Попробуйте построить с C:\MinGW\bin\gcc.exe -shared -s build\temp.win32-2.7\Release\image_box.o -Lc:\python27\libs -Lc:\python27\PCbuild -lp   -  person moskito-x    schedule 08.10.2012
comment
О, мы, должно быть, писали в одно и то же время. флаг -march = i486, похоже, решает проблему, если он применяется как на этапах компиляции, так и на этапах компоновки. Просто из любопытства я попробовал вашу строку (без файла .def), и у меня все еще была ошибка. Спасибо, в любом случае   -  person martinako    schedule 08.10.2012


Ответы (1)


Я нашел решение.

Собственно, флаг 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, чтобы включить эти флаги в этапы компиляции и компоновки. Не уверен, что это очень элегантный способ установки этих флагов. Приветствуются любые альтернативы!

person martinako    schedule 08.10.2012