赛顿设置.pyDLL包装教程中的编译错误:无法解析的外部符号

2024-09-30 20:20:58 发布

您现在位置:Python中文网/ 问答频道 /正文

背景故事: 对于我的一个需要大量计算的项目,我现在从我的Python代码调用一个.exe,它来自一个C++代码,它在磁盘上读/写文件,因此非常慢。在

为了解决这个问题,我把C++代码重新编码为我的Python代码中的一个DLL,因为那时不会有磁盘访问,它应该更快。为此我打算用赛顿。在

问题: 为了更好地理解它是如何工作的,因此我跟随this tutorial,作者是J.J. Hakala,他经常在这里发布关于Cython的文章。在

我跟踪了每一部分,在Windows的同一目录中:

  • 我用MS Visual Studio 2015学习版编译的DLL文件:complexFunLib.dll
  • DLL附带的.lib文件:complexFunLib.lib
  • C++ DLL源的头文件:^ {< CD3> }
  • Cython“header”文件:ccomplexFunLib.pxd(是的,有一个额外的'c')
  • Cython“包装器”文件:complexFunLib.pyx
  • 用于创建complexFunLib.pyd用Cython:setup.py

当我试图首先运行python setup.py --build_ext --inplace时,它找不到库,所以我不得不用另一个so问题中的that trick来判断DLL在哪里,所以在setup.py中,我修改了:libraries=[r'.\complexFunLib'],然后这个错误就消失了。在

这就引出了我当前未解决的错误:

当我运行python setup.py --build_ext --inplace时,它使用MinGW并引发以下错误:

编辑,我将完整日志放入:

running build_ext

cythoning complexFunLib.pyx to complexFunLib.cpp

building 'complexFunLib' extension

creating build

creating build\temp.win-amd64-3.6

creating build\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 In file included from D:\MYNAME\AppData\Local\Continuum\Anaconda3\lib\site-packages\numpy\core\include/numpy/ndarraytypes.h:1809:0, from D:\MYNAME\AppData\Local\Continuum\Anaconda3\lib\site-packages\numpy\core\include/numpy/ndarrayobject.h:18, from D:\MYNAME\AppData\Local\Continuum\Anaconda3\lib\site-packages\numpy\core\include/numpy/arrayobject.h:4, from complexFunLib.cpp:500:

D:\MYNAME\AppData\Local\Continuum\Anaconda3\lib\site-packages\numpy\core\include/numpy/npy_1_7_deprecated_api.h:13:79: note: #pragma message:

D:\MYNAME\AppData\Local\Continuum\Anaconda3\lib\site-packages\numpy\core\include/numpy/npy_1_7_deprecated_api.h(12) : Warning Msg: Using deprecated NumPy API, disable it by #defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION

"#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION")

                                                              ^

complexFunLib.cpp: In function 'PyTypeObject* __Pyx_ImportType(const char*, const char*, size_t, int)':

complexFunLib.cpp:7149:53: warning: unknown conversion type character 'z' in format [-Wformat=]

        module_name, class_name, basicsize, size);

                                                ^

complexFunLib.cpp:7149:53: warning: unknown conversion type character 'z' in format [-Wformat=]

complexFunLib.cpp:7149:53: warning: too many arguments for format [-Wformat-extra-args]

writing 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): undefined reference to `mp_mlt_exp_c4'

build\temp.win-amd64-3.6\Release\complexfunlib.o:complexFunLib.cpp:(.text+0x3ba7): undefined reference to `mp_mlt_exp_c8'

collect2.exe: error: ld returned 1 exit status error: command 'D:\MYNAME\AppData\Local\Continuum\Anaconda3\Library\mingw-w64\bin\g++.exe' failed with exit status 1

当我运行(以防万一)python setup.py --build_ext --inplace --compiler=msvc时,因为我不知道是否应该使用编译DLL的同一编译器编译它,它使用Visual Studio的编译器并引发以下错误:

编辑,我将MSVC的完整日志放入:

running build_ext

cythoning complexFunLib.pyx to complexFunLib.cpp

building 'complexFunLib' extension

creating build

creating build\temp.win-amd64-3.6

creating build\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:\Program Files (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\continuum\anaconda3\lib\site-packages\numpy\core\include\numpy\npy_1_7_deprecated_api.h(12) : Warning Msg: Using deprecated NumPy API, disable it by #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:EMBED,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)\Microsoft Visual 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.6\Release\complexFunLib.cp36-win_amd64.lib complexFunLib.obj : warning LNK4197: export 'PyInit_complexFunLib' specified multiple times; using first specification

Creating library build\temp.win-amd64-3.6\Release\complexFunLib.cp36-win_amd64.lib and object build\temp.win-amd64-3.6\Release\complexFunLib.cp36-win_amd64.exp

complexFunLib.obj : error LNK2001: unresolved external symbol mp_mlt_exp_c8

complexFunLib.obj : error LNK2001: unresolved external symbol mp_mlt_exp_c4

D:\PATH_TO_PROJECT\complexFunLib.cp36-win_amd64.pyd : fatal error LNK1120: 2 unresolved externals

error: command 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\link.exe' failed with exit status 1120

这两个错误是相同的,并且“未定义引用”或“外部符号”{{CD12>}和^ {CD13>}是C++标题和.CPP中声明和定义的函数,也是在.pxd和.pYx中的函数,如从开始时链接到的教程页中可以看到的。在

我真的不确定如何解决这个问题,它看起来像是一个与赛顿机械的连接问题,所以如果有人在这方面有知识,我很高兴听到它:)。在

编辑:

@ead问的dumpbin

Dump of file complexFunLib.dll

File Type: DLL

Section contains the following exports for 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

Summary

    1000 .data
    1000 .gfids
    1000 .rdata
    1000 .reloc
    1000 .rsrc
    1000 .text

Tags: buildnumpyreleaseincludeliblocalwinappdata