MSV C ошибка LNK2001: неразрешенный внешний символ - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь скомпилировать библиотеку 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? Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 06 мая 2020

Согласно комментариям, я не указывал fftw3.lib в аргументах link.exe. /LIBPATH ведет себя как флаг -L в компиляторах unix, и для флага -l нет эквивалента. Вместо этого мы должны передать либо полный путь к библиотеке, либо только имя файла библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...