Я пытаюсь скомпилировать библиотеку Python, содержащую привязки cython, в библиотеку FFTW, которая написана в C. Я использую компьютер Windows и обновил до последней версии инструментов сборки MSV C. У меня установлены инструменты сборки 2017 (v15.9.22) и Build Tools 2019 (v16.5.4).
Я создал отдельную среду conda с именем tsne
, используя conda create --name tsne python=3.7.4
, и установил FFTW, используя conda, используя conda install -c conda-forge fftw
. Мой setup.py
определяет соответствующие расширения и каталоги для компиляции модулей. Например, подключаемые каталоги для заголовков C правильно включены в miniconda3\envs\tsne\Library\include
, а также каталоги библиотек с miniconda3\envs\tsne\Library\lib
.
Когда я пытаюсь скомпилировать расширение, основанное на FFTW, я получаю следующая ошибка
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.25.28610\bin\HostX86\x64\cl.exe
/c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:\Users\pavli\miniconda3\envs\tsne\include
-IC:\Users\pavli\miniconda3\envs\tsne\Library\include
-IC:\Users\pavli\miniconda3\envs\tsne\lib\site-packages\numpy\core\include
-IC:\Users\pavli\miniconda3\envs\tsne\include
-IC:\Users\pavli\miniconda3\envs\tsne\include
"-IC:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.25.28610\include"
"-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt"
"-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\shared"
"-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um"
"-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\winrt"
"-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\cppwinrt"
/TcopenTSNE/_matrix_mul/matrix_mul_fftw3.c
/Fobuild\temp.win-amd64-3.7\Release\openTSNE/_matrix_mul/matrix_mul_fftw3.obj
/Ox /openmp
matrix_mul_fftw3.c
C:\Users\pavli\miniconda3\envs\tsne\lib\site-packages\numpy\core\include\numpy\npy_1_7_deprecated_api.h(14) : Warning Msg: Using deprecated NumPy API, disable it with #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
openTSNE/_matrix_mul/matrix_mul_fftw3.c(2704): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
openTSNE/_matrix_mul/matrix_mul_fftw3.c(2741): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
openTSNE/_matrix_mul/matrix_mul_fftw3.c(2760): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
openTSNE/_matrix_mul/matrix_mul_fftw3.c(3199): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
openTSNE/_matrix_mul/matrix_mul_fftw3.c(3199): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
openTSNE/_matrix_mul/matrix_mul_fftw3.c(3237): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
openTSNE/_matrix_mul/matrix_mul_fftw3.c(3237): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
openTSNE/_matrix_mul/matrix_mul_fftw3.c(3257): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
openTSNE/_matrix_mul/matrix_mul_fftw3.c(3257): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.25.28610\bin\HostX86\x64\link.exe
/nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO
/LIBPATH:C:\Users\pavli\miniconda3\envs\tsne\lib
/LIBPATH:C:\Users\pavli\miniconda3\envs\tsne\Library\lib
/LIBPATH:C:\Users\pavli\miniconda3\envs\tsne\libs
/LIBPATH:C:\Users\pavli\miniconda3\envs\tsne\PCbuild\amd64
"/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.25.28610\lib\x64"
"/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\ucrt\x64"
"/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x64"
/EXPORT:PyInit_matrix_mul build\temp.win-amd64-3.7\Release\openTSNE/_matrix_mul/matrix_mul_fftw3.obj
/OUT:C:\Users\pavli\Desktop\openTSNE\openTSNE\_matrix_mul\matrix_mul.cp37-win_amd64.pyd
/IMPLIB:build\temp.win-amd64-3.7\Release\openTSNE/_matrix_mul\matrix_mul.cp37-win_amd64.lib
/Ox /openmp
LINK : warning LNK4044: unrecognized option '/Ox'; ignored
LINK : warning LNK4044: unrecognized option '/openmp'; ignored
Creating library build\temp.win-amd64-3.7\Release\openTSNE/_matrix_mul\matrix_mul.cp37-win_amd64.lib and object build\temp.win-amd64-3.7\Release\openTSNE/_matrix_mul\matrix_mul.cp37-win_amd64.exp
matrix_mul_fftw3.obj : error LNK2001: unresolved external symbol fftw_destroy_plan
matrix_mul_fftw3.obj : error LNK2001: unresolved external symbol fftw_plan_dft_r2c_1d
matrix_mul_fftw3.obj : error LNK2001: unresolved external symbol fftw_execute
matrix_mul_fftw3.obj : error LNK2001: unresolved external symbol fftw_plan_dft_c2r_2d
matrix_mul_fftw3.obj : error LNK2001: unresolved external symbol fftw_plan_dft_r2c_2d
matrix_mul_fftw3.obj : error LNK2001: unresolved external symbol fftw_plan_dft_c2r_1d
C:\Users\pavli\Desktop\openTSNE\openTSNE\_matrix_mul\matrix_mul.cp37-win_amd64.pyd : fatal error LNK1120: 6 unresolved externals
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\VC\\Tools\\MSVC\\14.25.28610\\bin\\HostX86\\x64\\link.exe' failed with exit status 1120
Ошибка указывает на то, что скомпилированная библиотека не найдена (я полагаю? Я не настолько знаком ...). Однако я могу убедиться, что библиотека есть. Итак, miniconda3\envs\tsne\Library\lib\fftw3.lib
действительно существует. Затем я подумал, что, возможно, что-то не так с файлом fftw3.lib, поэтому я выгрузил символы, используя dumpbin.exe
. Все символы, которые, по словам компоновщика, отсутствуют, на самом деле присутствуют, например, соответствующий блок дампа для fftw_execute
Version : 0
Machine : 8664 (x64)
TimeDateStamp: 5DC30B59 Wed Nov 6 19:05:13 2019
SizeOfData : 00000017
DLL name : fftw3.dll
Symbol name : fftw_execute
Type : code
Name type : name
Hint : 60
Name : fftw_execute
Итак, если я правильно понимаю, файл lib в порядке. В системах Unix я могу просто указать компоновщику, где находится go, указав флаг -lfftw
, но, очевидно, этого нет в MSV C. Я запутался, потому что флаг компоновщика /LIBPATH:C:\Users\pavli\miniconda3\envs\tsne\Library\lib
передан, но, видимо, он не находит файл fftw3.lib? Любая помощь будет принята с благодарностью.