嗨,我是Cython的新手,我想与现有的C代码接口,但我在链接程序时遇到了问题。
在此之前,我已经让一个常规的cython模块工作了很多次,现在我想与我的C代码接口,只是为了清楚起见。
以下是我的目录结构:
Example <-- Master directory opened from here
CSourceCode
source.c
source.h
cprogram.pxd
program.c
program.pyx
setup.py
testing_interface.py
设置.py
from setuptools import setup, Extension
from Cython.Build import cythonize
setup (
ext_modules=cythonize([Extension("program", ["program.pyx"])])
)
程序.pxd
cdef extern from "CSourceCode/source.h":
void hello()
源.c
#include <stdio.h>
int main(void)
{
return 0;
}
void hello()
{
printf("HELLO FROM C");
}
源.h
#ifndef _SOURCE
#define _SOURCE "source.h"
void hello();
#endif
程序.pyx
cimport cprogram
def hello():
cprogram.hello()
测试接口.py
import program
program.hello()
跟踪
python setup.py build_ext -i
Compiling program.pyx because it changed.
[1/1] Cythonizing program.pyx
C:UsersbmxfiAppDataLocalProgramsPythonPython39libsite-packagesCythonCompilerMain.py:369: FutureWarning: Cython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: C:UsersbmxfiDesktopcodeCPythonCInterfacingExampleprogram.pyx
tree = Parsing.p_module(s, pxd, full_module_name)
running build_ext
building 'program' extension
C:Program Files (x86)Microsoft Visual Studio2017BuildToolsVCToolsMSVC14.16.27023binHostX86x64cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -I. -IC:UsersbmxfiAppDataLocalProgramsPythonPython39include -IC:UsersbmxfiAppDataLocalProgramsPythonPython39include -IC:Program Files (x86)Microsoft Visual Studio2017BuildToolsVCToolsMSVC14.16.27023include -IC:Program Files (x86)Windows Kits10include10.0.17763.0ucrt -IC:Program Files (x86)Windows Kits10include10.0.17763.0shared -IC:Program Files (x86)Windows Kits10include10.0.17763.0um -IC:Program Files (x86)Windows Kits10include10.0.17763.0winrt -IC:Program Files (x86)Windows Kits10include10.0.17763.0cppwinrt /Tcprogram.c /Fobuildtemp.win-amd64-3.9Releaseprogram.obj
program.c
C:Program Files (x86)Microsoft Visual Studio2017BuildToolsVCToolsMSVC14.16.27023binHostX86x64link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:C:UsersbmxfiAppDataLocalProgramsPythonPython39libs /LIBPATH:C:UsersbmxfiAppDataLocalProgramsPythonPython39PCbuildamd64 /LIBPATH:C:Program Files (x86)Microsoft Visual Studio2017BuildToolsVCToolsMSVC14.16.27023libx64 /LIBPATH:C:Program Files (x86)Windows Kits10lib10.0.17763.0ucrtx64 /LIBPATH:C:Program Files (x86)Windows Kits10lib10.0.17763.0umx64 /EXPORT:PyInit_program buildtemp.win-amd64-3.9Releaseprogram.obj /OUT:buildlib.win-amd64-3.9program.cp39-win_amd64.pyd /IMPLIB:buildtemp.win-amd64-3.9Releaseprogram.cp39-win_amd64.lib
Creating library buildtemp.win-amd64-3.9Releaseprogram.cp39-win_amd64.lib and object buildtemp.win-amd64-3.9Releaseprogram.cp39-win_amd64.exp
program.obj : error LNK2001: unresolved external symbol hello
buildlib.win-amd64-3.9program.cp39-win_amd64.pyd : fatal error LNK1120: 1 unresolved externals
error: command 'C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\link.exe' failed with exit code 1120
您需要将source.c指定为program.pyx文件的源。一种方法是将头注释# distutils: sources = CSourceCode/source.c
添加到program.pyx文件的顶部。您可以查看Cython公会关于配置C构建的更多信息。