anaconda cythonize C++ on windows 10

anaconda cythonize C++ on windows 10

本文关键字:windows on C++ cythonize anaconda      更新时间:2023-10-16

我有 c++ 代码,可以在安装在我电脑上的 MSVS 2015 中编译良好。 我的任务是使用 cython 制作一个 python 扩展,以便能够从我们的 python 应用程序调用 c++ 函数。 我已经安装了蟒蛇 5.2 w/cython 已经安装。 c++ 有一堆头文件,编译时需要包含这些文件。 我正在尝试构建一个函数并遇到相同的错误。

对于一个函数,我的test.pyx看起来像这样:

cimport test
cimport cython
def pxd_PIXCIclose():
res = test.pxd_PIXCIclose()
return res

test.pxd 如下所示:

cdef extern from "D:epixincxcliball.h":  
int pxd_PIXCIclose()

setup.py 是:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
ext_modules = Extension(
name = "test",
sources=["test.pyx"],
include_dirs=["D:epixlib", "D:epixinc"],  
library_dirs="D:epixincXCLIBW64.lib","D:epixlibPXIPLW64.lib"]
)
setup(
name = "test.pyx",
ext_modules = cythonize([ext_modules])
)

test.c 已创建,但随后我在 C++ include 文件夹中的标头上收到一堆构建错误:

python setup.py build_ext --inplace --compiler=msvc
Compiling test.pyx because it depends on .test.pxd.
[1/1] Cythonizing test.pyx
running build_ext
building 'test' extension
C:Program Files (x86)Microsoft Visual Studio 14.0VCBINx86_amd64cl.exe 
/c /nologo /Ox /W3 /GL /DNDEBUG /MD -ID:epixlib -ID:epixinc - 
IC:Anaconda3include -IC:Anaconda3include "-IC:Program Files 
(x86)Microsoft Visual Studio 14.0VCINCLUDE" "-IC:Program Files 
(x86)Microsoft Visual Studio 14.0VCATLMFCINCLUDE" "-IC:Program Files 
(x86)Windows Kits10include10.0.10586.0ucrt" "-IC:Program Files 
(x86)Windows KitsNETFXSDK4.6.1includeum" "-IC:Program Files 
(x86)Windows Kits10include10.0.10586.0shared" "-IC:Program Files 
(x86)Windows Kits10include10.0.10586.0um" "-IC:Program Files 
(x86)Windows Kits10include10.0.10586.0winrt" /Tctest.c 
/Fobuildtemp.win-amd64-3.6Releasetest.obj
test.c
d:epixincpxlibsv.h(312): error C2061: syntax error: identifier 'HANDLE'
d:epixincpxlibsv.h(317): error C2059: syntax error: '}'
d:epixincpxlibsv.h(827): error C2143: syntax error: missing ')' before 
'*'
d:epixincpxlibsv.h(827): error C2081: 'HANDLE': name in formal parameter 
list illegal
d:epixincpxlibsv.h(827): error C2143: syntax error: missing ';' before 
'*'
d:epixincpxlibsv.h(827): error C2059: syntax error: '*'
.
.
.
d:epixincxclibsc.h(369): fatal error C1003: error count exceeds 100; 
stopping compilation
error: command 'C:\Program Files (x86)\Microsoft Visual Studio 
14.0\VC\BIN\x86_amd64\cl.exe' failed with exit status 2

我猜我的 setup.py 不正确?有人对正在发生的事情有任何指示吗?

通过添加 #include windows.h 更新我的原始帖子,原始的"HANDLE"错误现已消失,但现在我收到了此链接错误:

(base) d:epixcython>python setup.py build_ext --inplace --compiler=msvc
running build_ext
building 'test' extension
C:Program Files (x86)Microsoft Visual Studio 14.0VCBINx86_amd64cl.exe 
/c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:Anaconda3include -ID:epixlib - 
ID:epixinc -IC:Anaconda3include -IC:Anaconda3include "-IC:Program 
Files (x86)Microsoft Visual Studio 14.0VCINCLUDE" "-IC:Program Files 
(x86)Microsoft Visual Studio 14.0VCATLMFCINCLUDE" "-IC:Program Files 
(x86)Windows Kits10include10.0.10586.0ucrt" "-IC:Program Files 
(x86)Windows KitsNETFXSDK4.6.1includeum" "-IC:Program Files 
(x86)Windows Kits10include10.0.10586.0shared" "-IC:Program Files 
(x86)Windows Kits10include10.0.10586.0um" "-IC:Program Files 
(x86)Windows Kits10include10.0.10586.0winrt" /Tctest.c 
/Fobuildtemp.win-amd64-3.6Releasetest.obj
test.c
C:Program Files (x86)Microsoft Visual Studio 
14.0VCBINx86_amd64link.exe /nologo /INCREMENTAL:NO /LTCG /DLL 
/MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:C:Anaconda3Lib 
/LIBPATH:D:epixincXCLIBW64.lib /LIBPATH:D:epixlibPXIPLW64.lib 
/LIBPATH:C:Anaconda3libs /LIBPATH:C:Anaconda3PCbuildamd64 
"/LIBPATH:C:Program Files (x86)Microsoft Visual Studio 14.0VCLIBamd64" 
"/LIBPATH:C:Program Files (x86)Microsoft Visual Studio 
14.0VCATLMFCLIBamd64" "/LIBPATH:C:Program Files (x86)Windows 
Kits10lib10.0.10586.0ucrtx64" "/LIBPATH:C:Program Files (x86)Windows 
KitsNETFXSDK4.6.1libumx64" "/LIBPATH:C:Program Files (x86)Windows 
Kits10lib10.0.10586.0umx64" /EXPORT:PyInit_test buildtemp.win-amd64- 
3.6Releasetest.obj /OUT:d:epixcythontest.cp36-win_amd64.pyd 
/IMPLIB:buildtemp.win-amd64-3.6Releasetest.cp36-win_amd64.lib
test.obj : warning LNK4197: export 'PyInit_test' specified multiple times; 
using first specification
Creating library buildtemp.win-amd64-3.6Releasetest.cp36-win_amd64.lib 
and object buildtemp.win-amd64-3.6Releasetest.cp36-win_amd64.exp
test.obj : error LNK2001: unresolved external symbol pxd_PIXCIclose
d:epixcythontest.cp36-win_amd64.pyd : fatal error LNK1120: 1 unresolved 
externals error: command 'C:\Program Files (x86)\Microsoft Visual Studio 
14.0\VC\BIN\x86_amd64\link.exe' failed with exit status 1120

关于解决此错误的任何建议? 谢谢。

基于编译器输出,未定义句柄。您知道吗,使用VS2015您需要添加SDK的路径?正如我所看到的,它不包括在内。将 C:\Program Files (x86(\Windows Kits\10 \ include\ platformtoolset\um 添加到路径。 平台工具集将在您的包含路径中定义子文件夹。希望对您有所帮助。

通过将 #include windows.h 添加到我的标头,然后将我的原始 setup.py 更改为以下内容:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize

ext_modules = Extension(
name = "test",
sources=["test.pyx"],
include_dirs=["D:epixlib", "D:epixinc"],
library_dirs=["D:epixinc"],
libraries=["XCLIBW64", "PXIPLW64"]
)
setup(
name = "test.pyx",
ext_modules = cythonize([ext_modules])

我能够成功地将我的 c 项目中的一个函数进行系统化。 感谢所有给我建议的人,这些建议为我指明了正确的方向。