Ошибка компиляции Cython setup.py в руководстве по переносу DLL: нерешенный внешний символ - PullRequest
0 голосов
/ 05 июня 2018

Предыстория: Для одного из моих проектов, требующих сложных вычислений, в настоящее время я вызываю из своего кода 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
...