简体   繁体   English

Windows 10上的anaconda cythonize C ++

[英]anaconda cythonize C++ on windows 10

I have c++ code that compiles fine in MSVS 2015 which is installed on my PC. 我的C ++代码可以在PC上安装的MSVS 2015中很好地进行编译。 I've been tasked to make a python extension using cython to be able to call c++ function from our python application. 我的任务是使用cython进行python扩展,以便能够从我们的python应用程序调用c ++函数。 I have installed anaconda 5.2 w/ cython installed already. 我已经安装了带有cython的anaconda 5.2。 The c++ has a bunch of header files that need to be included when compiling. C ++有很多头文件,在编译时需要包含这些头文件。 I'm trying to build one function and am running into the same error. 我正在尝试构建一个函数,并遇到相同的错误。

My test.pyx looks like this for the one function: 我的test.pyx看起来像一个函数:

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

The test.pxd is as follows: test.pxd如下所示:

cdef extern from "D:\epix\inc\xcliball.h":  
int pxd_PIXCIclose()

setup.py is: 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:\epix\lib", "D:\epix\inc"],  
                library_dirs="D:\epix\inc\XCLIBW64.lib","D:\epix\lib\PXIPLW64.lib"]
              )

setup(
  name = "test.pyx",
  ext_modules = cythonize([ext_modules])
)

The test.c is created but then I get a bunch of build errors on the headers in the C++ include folder: 创建了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.0\VC\BIN\x86_amd64\cl.exe 
/c /nologo /Ox /W3 /GL /DNDEBUG /MD -ID:\epix\lib -ID:\epix\inc - 
IC:\Anaconda3\include -IC:\Anaconda3\include "-IC:\Program Files 
(x86)\Microsoft Visual Studio 14.0\VC\INCLUDE" "-IC:\Program Files 
(x86)\Microsoft Visual Studio 14.0\VC\ATLMFC\INCLUDE" "-IC:\Program Files 
(x86)\Windows Kits\10\include\10.0.10586.0\ucrt" "-IC:\Program Files 
(x86)\Windows Kits\NETFXSDK\4.6.1\include\um" "-IC:\Program Files 
(x86)\Windows Kits\10\include\10.0.10586.0\shared" "-IC:\Program Files 
(x86)\Windows Kits\10\include\10.0.10586.0\um" "-IC:\Program Files 
(x86)\Windows Kits\10\include\10.0.10586.0\winrt" /Tctest.c 
/Fobuild\temp.win-amd64-3.6\Release\test.obj
test.c

d:\epix\inc\pxlibsv.h(312): error C2061: syntax error: identifier 'HANDLE'
d:\epix\inc\pxlibsv.h(317): error C2059: syntax error: '}'
d:\epix\inc\pxlibsv.h(827): error C2143: syntax error: missing ')' before 
'*'
d:\epix\inc\pxlibsv.h(827): error C2081: 'HANDLE': name in formal parameter 
list illegal
d:\epix\inc\pxlibsv.h(827): error C2143: syntax error: missing ';' before 
'*'
d:\epix\inc\pxlibsv.h(827): error C2059: syntax error: '*'
.
.
.
d:\epix\inc\xclibsc.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

I'm guessing my setup.py is not correct? 我猜我的setup.py不正确? Anyone have any pointers on what is happening? 任何人都对发生的事情有任何指示?

Update to my original post, by adding #include windows.h, the original 'HANDLE' error is now gone but I received this link error now: 通过添加#include windows.h更新到我的原始帖子,原始的“ HANDLE”错误现在消失了,但是我现在收到此链接错误:

(base) d:\epix\cython>python setup.py build_ext --inplace --compiler=msvc
running build_ext
building 'test' extension
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe 
/c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:\Anaconda3\include -ID:\epix\lib - 
ID:\epix\inc -IC:\Anaconda3\include -IC:\Anaconda3\include "-IC:\Program 
Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE" "-IC:\Program Files 
(x86)\Microsoft Visual Studio 14.0\VC\ATLMFC\INCLUDE" "-IC:\Program Files 
(x86)\Windows Kits\10\include\10.0.10586.0\ucrt" "-IC:\Program Files 
(x86)\Windows Kits\NETFXSDK\4.6.1\include\um" "-IC:\Program Files 
(x86)\Windows Kits\10\include\10.0.10586.0\shared" "-IC:\Program Files 
(x86)\Windows Kits\10\include\10.0.10586.0\um" "-IC:\Program Files 
(x86)\Windows Kits\10\include\10.0.10586.0\winrt" /Tctest.c 
/Fobuild\temp.win-amd64-3.6\Release\test.obj
test.c
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:C:\Anaconda3\Lib 
/LIBPATH:D:\epix\inc\XCLIBW64.lib /LIBPATH:D:\epix\lib\PXIPLW64.lib 
/LIBPATH:C:\Anaconda3\libs /LIBPATH:C:\Anaconda3\PCbuild\amd64 
"/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\amd64" 
"/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio 
14.0\VC\ATLMFC\LIB\amd64" "/LIBPATH:C:\Program Files (x86)\Windows 
Kits\10\lib\10.0.10586.0\ucrt\x64" "/LIBPATH:C:\Program Files (x86)\Windows 
Kits\NETFXSDK\4.6.1\lib\um\x64" "/LIBPATH:C:\Program Files (x86)\Windows 
Kits\10\lib\10.0.10586.0\um\x64" /EXPORT:PyInit_test build\temp.win-amd64- 
3.6\Release\test.obj /OUT:d:\epix\cython\test.cp36-win_amd64.pyd 
/IMPLIB:build\temp.win-amd64-3.6\Release\test.cp36-win_amd64.lib
test.obj : warning LNK4197: export 'PyInit_test' specified multiple times; 
using first specification
Creating library build\temp.win-amd64-3.6\Release\test.cp36-win_amd64.lib 
and object build\temp.win-amd64-3.6\Release\test.cp36-win_amd64.exp
test.obj : error LNK2001: unresolved external symbol pxd_PIXCIclose
d:\epix\cython\test.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

Any suggestions on resolving this error? 有关解决此错误的任何建议? Thank you. 谢谢。

Based on compiler output, HANDLE is not defined. 根据编译器输出,未定义HANDLE。 Did you know, that with VS2015 you need to add path to SDK ? 您是否知道,使用VS2015,您需要添加SDK的路径? It is not included, as I can see. 如我所见,它不包括在内。 Add C:\\Program Files (x86)\\Windows Kits\\10 \\ include\\ platformtoolset\\um to path. 将C:\\ Program Files(x86)\\ Windows Kits \\ 10 \\ include \\ platformtoolset \\ um添加到路径。 Platformtoolset will define subfolder in yours include path. Platformtoolset将在您的包含路径中定义子文件夹。 Hope it helps. 希望能帮助到你。

By adding #include windows.h to my header and then changing my original setup.py to the following: 通过将#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:\epix\lib", "D:\epix\inc"],
          library_dirs=["D:\epix\inc"],
          libraries=["XCLIBW64", "PXIPLW64"]

          )

setup(
name = "test.pyx",
ext_modules = cythonize([ext_modules])

I was able to successfully cythonize one of the functions in my c project. 我能够成功地对c项目中的函数之一进行cythonize处理。 Thank you to all who gave me suggestions that pointed me in the right direction. 感谢所有为我提供建议的人,这些建议为我指明了正确的方向。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM