Предыстория: Для одного из моих проектов, требующих сложных вычислений, в настоящее время я вызываю из своего кода Python .exe, исходящий из кода C ++, который читает / записывает файлы на диск и, таким образом, является супермедленно.
Чтобы решить эту проблему, я перекодировал код C ++, который будет использоваться в качестве библиотеки DLL в моем коде Python, поскольку с тех пор не будет доступа к диску, и он должен быть быстрее.Для этого я планирую использовать Cython.
Проблема: Чтобы лучше понять, как это работает, поэтому я следую этому учебнику , JJ Hakala , который на самом деле часто пишет здесь о Cython.
Я следил за каждой частью, и у меня в одной папке в Windows:
- DLL-файл, который я скомпилировал с MS Visual Studio2015 Express:
complexFunLib.dll
- .lib-файл, который поставляется вместе с DLL:
complexFunLib.lib
- заголовочный файл для источника C ++ DLL:
complexFunLib.h
- theФайл заголовка Cython:
ccomplexFunLib.pxd
(да, есть дополнительный 'c') - Файл оболочки "Cython":
complexFunLib.pyx
- установочный файл Python для создания complexFunLib.pydс Cython:
setup.py
Когда я сначала попытался запустить python setup.py --build_ext --inplace
, он не смог найти библиотеку, поэтому мне пришлось использовать этот трюк из другого вопроса SO, чтобы сказатьгде была DLL, поэтому в setup.py
я изменил: libraries=[r'.\complexFunLib']
, тогда эта ошибка исчезла.
, что подводит меня к моей текущей нерешеннойошибка:
Когда я запускаю python setup.py --build_ext --inplace
, он использует MinGW и выдает эту ошибку:
РЕДАКТИРОВАТЬ, Я УСТАНАВЛИВАЮ ПОЛНЫЙ ЛОГ:
запуск build_ext
кайтинг от ComplexFunLib.pyx до complexFunLib.cpp
построение расширения complexFunLib
создание сборки
создание сборки \ temp.win-amd64-3.6
создание сборки \ temp.win-amd64-3.6 \ Release
D: \ MYNAME \ AppData \ Local \ Continuum \ Anaconda3 \ Library \ mingw-w64 \ bin \ gcc.exe-mdll -O -Wall -DMS_WIN64 -ID: \ MYNAME \ AppData \ Local \ Continuum \ Anaconda3 \ lib \ site-packages \ numpy \ core \ include -ID: \ MYNAME \ AppData \ Local \ Continuum \ Anaconda3 \ include-ID: \ MYNAME \ AppData \ Local \ Continuum \ Anaconda3 \ include -c complexFunLib.cpp -o build \ temp.win-amd64-3.6 \ Release \ complexfunlib.o В файле, включенном в D: \ MYNAME \ AppData \ Local \ Continuum \Anaconda3 \ lib \ site-packages \ numpy \ core \ include / numpy / ndarraytypes.h: 1809: 0, из D: \ MYNAME \ AppData \ Local \ Continuum \ Anaconda3 \ lib \ site-packages \ numpy \ core \ include /NumPy / ndarrayobject.h: 18, из D: \ MYNAME \ AppData \ Local \ Continuum \ Anaconda3 \ lib \ site-packages \ numpy \ core \ include / numpy / arrayobject.h: 4, из complexFunLib.cpp: 500:
D: \ MYNAME \ AppData \ Local \ Continuum \ Anaconda3 \ lib \ site-packages \ numpy \ core \ include / numpy / npy_1_7_deprecated_api.h: 13: 79: примечание: #pragma message:
D: \ MYNAME \ AppData \ Local \ Continuum \ Anaconda3 \ lib \ site-packages \ numpy \ core \ include / numpy / npy_1_7_deprecated_api.h (12): предупреждение Msg: используя устаревший API NumPy, отключите его #defining NPY_NO_DEPRECAT____I_API1070 *
"# определение NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION")
^
complexFunLib.cpp: в функции 'PyTypeObject * __Pyx_ImportType (const char *, const75 * *): размер * const * *: размер * const * *:1076 * complexFunLib.cpp: 7149: 53: предупреждение: неизвестный символ типа преобразования 'z' в формате [-Wformat =]
module_name, class_name, basicsize, size);
^
complexFunLib.cpp: 7149: 53: предупреждение: неизвестный символ типа преобразования 'z 'в формате [-Wformat =]
complexFunLib.cpp: 7149: 53: войнаning: слишком много аргументов для формата [-Wformat-extra-args]
запись build \ temp.win-amd64-3.6 \ Release \ complexFunLib.cp36-win_amd64.def
D: \ MYNAME \ AppData \ Local \ Continuum \ Anaconda3 \ Library \ mingw-w64 \ bin \ g ++. Exe -shared -s build \ temp.win-amd64-3.6 \ Release \ complexfunlib.o build \ temp.win-amd64-3.6 \ Release \ complexFunLib.cp36-win_amd64.def -L.-LD: \ MYNAME \ AppData \ Local \ Continuum \ Anaconda3 \ libs -LD: \ MYNAME \ AppData \ Local \ Continuum \ Anaconda3 \ PCbuild \ amd64. \ ComplexFunLib.dll -lpython36 -lmsvcr140 -o "D: \ MYNAME \ PATH_TO_PROJECT\ complexFunLib.cp36-win_amd64.pyd "
build \ temp.win-amd64-3.6 \ Release \ complexfunlib.o: complexFunLib.cpp :(. text + 0x29b5): неопределенная ссылка на` mp_mlt_exp_c4 '
build \ temp.win-amd64-3.6 \ Release \ complexfunlib.o: complexFunLib.cpp :(. Text + 0x3ba7): неопределенная ссылка на `mp_mlt_exp_c8 '
collect2.exe: ошибка: ldвернул 1 ошибку состояния выхода: команда 'D: \ MYNAME \ AppData \ Local \ Continuum \ Anaconda3 \ Library \ mingw-w64 \ bin \ g ++. exe' завершилась неудачно с состоянием выхода 1
И когда язапустить (чтобы попробовать на всякий случай) python setup.py --build_ext --inplace --compiler=msvc
, так как я не знаю, должен ли он быть скомпилирован также с тем же компилятором, который скомпилировал DLL, он использует компилятор Visual Studio и вызывает эту ошибку:
РЕДАКТИРОВАТЬ, Я УСТАНАВЛИВАЮ ПОЛНЫЙ ЖУРНАЛ ДЛЯ MSVC:
работает build_ext
комплекс CythoningFunLib.pyx to complexFunLib.cpp
сборка расширения complexFunLib
создание сборки
создание сборки \ temp.win-amd64-3.6
создание сборки\ temp.win-amd64-3.6 \ Release
C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ BIN \ x86_amd64 \ cl.exe / c / nologo / Ox / W3 / GL /DNDEBUG / MD -ID: \ MYNAME \ AppData \ Local \ Continuum \ Anaconda3 \ lib \ site-packages \ numpy \ core \ include -ID: \ MYNAME \ AppData \ Local \ Continuum \ Anaconda3 \ include -ID: \ MYNAME \ AppData\ Local \ Continuum \ Anaconda3 \ include "-IC: \ ProgramFiles (x86) \ Microsoft Visual Studio 14.0 \ VC \ INCLUDE" "-IC: \ Program Files (x86) \ Windows Kits \ 10 \ include \ 10.0.10240.0 \ ucrt"" -IC: \ Program Files (x86) \ Windows Kits \ NETFXSDK \ 4.6.1 \ include \ um "" -IC: \ Program Files (x86) \ Windows Kits \ 8.1 \ include \ shared "" -IC: \Программные файлы (x86) \ Windows Kits \ 8.1 \ include \ um "" -IC: \ Program Files (x86) \ Windows Kits \ 8.1 \ include \ winrt "/ EHsc /TpcomplexFunLib.cpp /Fobuild\temp.win-amd64-3.6 \ Release \ complexFunLib.obj
complexFunLib.cpp
d: \ MYNAME \ appdata \ local \ континуум \ anaconda3 \ lib \ site-packages \ numpy \ core \ include \ numpy \ npy_1_7_deprecated_api.h (12): Предупреждение Сообщение: Использование устаревшего API NumPy,отключите его, #defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ BIN \ x86_amd64 \ link.exe / nologo / INCREMENTAL: NO / LTCG / DLL / MANIFEST:, ID = 2 / MANIFESTUAC: NO / LIBPATH :./ LIBPATH: D: \ MYNAME \ AppData \ Local \ Continuum \ Anaconda3 \ libs / LIBPATH: D: \ MYNAME \ AppData \ Local \ Continuum \ Anaconda3 \ PCbuild \ amd64 "/ LIBPATH: C: \ Program Files (x86) \ MicrosoftVisual Studio 14.0 \ VC \ LIB \ amd64 "" / LIBPATH: C: \ Program Files (x86) \ Windows Kits \ 10 \ lib \ 10.0.10240.0 \ ucrt \ x64 "" / LIBPATH: C: \ Program Files (x86)\ Windows Kits \ NETFXSDK \ 4.6.1 \ lib \ um \ x64 "" / LIBPATH: C: \ Program Files (x86) \ Windows Kits \ 8.1 \ lib \ winv6.3 \ um \ x64 ". \ ComplexFunLib.lib /EXPORT: PyInit_complexFunLib build \ temp.win-amd64-3.6 \ Release \ complexFunLib.obj "/OUT:D:\MYNAME\PATH_TO_PROJECT\complexFunLib.cp36-win_amd64.pyd" / IMPLIB: build \ temp.win-amd64-3.6Release \ complexFunLib.cp36-win_amd64.lib complexFunLib.obj: предупреждение LNK4197: экспорт 'PyInit_complexFunLib' указан несколько раз;используя первую спецификацию
Создание библиотеки build \ temp.win-amd64-3.6 \ Release \ complexFunLib.cp36-win_amd64.lib и сборка объекта \ temp.win-amd64-3.6 \ Release \ complexFunLib.cp36-win_amd64.exp
complexFunLib.obj: ошибка LNK2001: неразрешенный внешний символ mp_mlt_exp_c8
complexFunLib.obj: ошибка LNK2001: неразрешенный внешний символ mp_mlt_exp_c4
D: \ PATH_p36_pro36Fwin_amd64.pyd: фатальная ошибка LNK1120: 2 неразрешенных внешних кода
ошибка: сбой команды 'C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ BIN \ x86_amd64 \ link.exe' со статусом выхода 1120
Эти две ошибки:Я полагаю, что то же самое и «неопределенные ссылки» или «внешние символы» mp_mlt_exp_c4
и mp_mlt_exp_c8
являются функциями, объявленными и определенными в заголовке C ++ и .cpp, а также в .pxd и .pyx, как это может бытьКак видно из страницы учебника, на которую я ссылался в начале.
Я действительно не уверен, как решить эту проблему, похоже, что проблема с механизмом Cython связана, так что если у кого-либо, кто разбирается в этой области, есть решение, я 'буду рад это услышать:).
РЕДАКТИРОВАТЬ:
dumpbin
, заданный @ead:
Дамп файлаcomplexFunLib.dll
Тип файла: DLL
Раздел содержит следующие экспорты для complexFunLib.dll
00000000 characteristics
5B1800BA time date stamp Wed Jun 6 17:41:46 2018
0.00 version
1 ordinal base
2 number of functions
2 number of names
ordinal hint RVA name
1 0 00001000 mp_mlt_exp_c4 = _mp_mlt_exp_c4
2 1 000010E0 mp_mlt_exp_c8 = _mp_mlt_exp_c8
Сводка
1000 .data
1000 .gfids
1000 .rdata
1000 .reloc
1000 .rsrc
1000 .text