背景故事: 对于我的一个需要大量计算的项目,我现在从我的Python代码调用一个.exe,它来自一个C++代码,它在磁盘上读/写文件,因此非常慢。在
为了解决这个问题,我把C++代码重新编码为我的Python代码中的一个DLL,因为那时不会有磁盘访问,它应该更快。为此我打算用赛顿。在问题: 为了更好地理解它是如何工作的,因此我跟随this tutorial,作者是J.J. Hakala,他经常在这里发布关于Cython的文章。在
我跟踪了每一部分,在Windows的同一目录中:
complexFunLib.dll
complexFunLib.lib
ccomplexFunLib.pxd
(是的,有一个额外的'c')complexFunLib.pyx
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
目前没有回答
相关问题 更多 >
编程相关推荐