尝试过这个例子" Python extensions with C libraries made easy by Cython"但是我没有让它发挥作用。我的系统适用于普通的Cython。随着setup.py的一些小变化(因为我使用Windows,必须使用setuptools而不是distutils)。制作了以下文件:
* cmean.h */
double mean(int, double*);
/* cmean.c */
double mean(int n, double* a)
{
double s;
int i;
for (s=0., i=0; i<n; i++) s+=*(a++);
return s/n;
}
# m.pyx
cdef extern from "cmean.h":
double mean(int, double*)
from stdlib cimport *
def cmean(a):
n = len(a)
cdef double *v
v = malloc(n*sizeof(double))
for i in range(n):
v[i] = float(a[i])
m = mean(n, v)
free(v)
return m
#setup.py
from setuptools import setup
from setuptools import Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext
ext_modules=[Extension("lib",
["m.pyx"],
library_dirs = ['.'],
libraries=["cmean"]
)] # Unix-like specific
setup(
name = "Demos",
ext_modules = cythonize(ext_modules),
cmdclass = {"build_ext": build_ext}
)
使用以下命令编译cmean.c:
gcc -shared cmean.c -o libcmean.so
但是当我跑步时:
python setup.py build_ext --inplace
我收到以下错误消息:
E:\GD\UD\Software\CythonTest\calling-c\test1>python setup.py build_ext --inplace
running build_ext
building 'lib' extension
C:\Users\trofl\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\Bin\cl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG -I. -IC:\Anaconda2\include -IC:\Anaconda2\PC /Tcm.c /Fobuild\temp.win32-2.7\Release\m.objm.c
C:\Users\trofl\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\Bin\link.exe /DLL /nologo /INCREMENTAL:NO /LIBPATH:. /LIBPATH:C:\ /LIBPATH:C:\Anaconda2\libs /LIBPATH:C:\Anaconda2\PCbuild /LIBPATH:C:\Anaconda2\PC\VS9.0 cmean.lib /EXPORT:initlib build\temp.win32-2.7\Release\m.obj /OUT:E:\GD\UD\Software\CythonTest\calling-c\test1\lib.pyd /IMPLIB:build\temp.win32-2.7\Release\lib.lib /MANIFESTFILE:build\temp.win32-2.7\Release\lib.pyd.manifest
LINK : fatal error LNK1181: cannot open input file 'cmean.lib'
error: command 'C:\\Users\\trofl\\AppData\\Local\\Programs\\Common\\Microsoft\\Visual C++ for Python\\9.0\\VC\\Bin\\link.exe' failed with exit status 1181
我尽可能地遵循了这个例子。
更新 我已经制作了一个cmean.lib文件作为最后一条错误消息说它在Microsoft Visual Studio 2008 x86工具的帮助下没有找到。试图使用与cython使用的相同的标志。我试图阅读很多abotu这个标志意味着什么,但我发现很多非常技术性的:
cl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG cmean.c
然后使用:
创建lib文件lib.exe lib.exe / out:cmean cmean.obj
但是我没有收到这个错误:
E:\GD\UD\Software\CythonTest\calling-c\test1>python setup.py build_ext --inplace
running build_ext
building 'lib' extension
creating build
creating build\temp.win32-2.7
creating build\temp.win32-2.7\Release
C:\Users\trofl\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\Bin\cl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG -IC:\Anaconda2\include -IC:\Anaconda2\PC /Tcm.c /Fobuild\temp.win32-2.7\Release\m.objm.c
C:\Users\trofl\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\Bin\link.exe /DLL /nologo /INCREMENTAL:NO /LIBPATH:. /LIBPATH:C:\Anaconda2\libs /LIBPATH:C:\Anaconda2\PCbuild /LIBPATH:C:\Anaconda2\PC\VS9.0 cmean.lib /EXPORT:initlib build\temp.win32-2.7\Release\m.obj /OUT:E:\GD\UD\Software\CythonTest\calling-c\test1\lib.pyd /IMPLIB:build\temp.win32-2.7\Release\lib.lib /MANIFESTFILE:build\temp.win32-2.7\Release\lib.pyd.manifest
LINK : error LNK2001: unresolved external symbol initlib
build\temp.win32-2.7\Release\lib.lib : fatal error LNK1120: 1 unresolved externals
error: command 'C:\\Users\\trofl\\AppData\\Local\\Programs\\Common\\Microsoft\\Visual C++ for Python\\9.0\\VC\\Bin\\link.exe' failed with exit status 1120
我假设我必须找出用于windows的visual c ++的参数,以便以正确的格式生成cmean.lib文件。
答案 0 :(得分:0)
我终于设法通过一个非常简单的修复工作。必须使用与pyx文件相同的库名称:
ext_modules=[Extension("m",
sources = ["m.pyx"],
library_dirs = ['.'],
libraries=["cmean"])] # Unix-like specific
这也在这篇文章中说明:
Cython compiled C extension: ImportError: dynamic module does not define init function
我还发现我可以用setuptools编译cmean.c文件:
#setup.py
from setuptools import setup
from setuptools import Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext
ext_modules=[Extension("m",
["m.pyx","cmean.c"] )]
setup(
name = "Demos",
ext_modules = cythonize(ext_modules),
cmdclass = {"build_ext": build_ext}
)
- fossekall