Cython Interfacing with C



嗨,我是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构建的更多信息。

最新更新