我实际上是想将现有的C库链接到我的Cython程序。
我可以访问库的入口标题(.h),所有函数都声明为:
EXPORT_API int _stdcall LibFunction();
我认为EXPORT_API
用于使用__declspec(dllexport)
创建dll ...
我也可以访问.lib和.dll文件。
我尝试将此函数与通常的cdef extern from
Cython一起使用:
cdef extern from "include\\entrypoint.h":
int LibFunction()
def c_LibFunction():
LibFunction()
我正在使用以下setup.py
from setuptools import setup, Extension
from Cython.Distutils import build_ext
NAME = 'testlib'
REQUIRES = ['cython']
SRC_DIR = 'testlib'
PACKAGES = [SRC_DIR]
INCLUDE_DIR = 'testlib\include'
LIB_DIR = 'testlib\lib'
ext = Extension(SRC_DIR + '.wrapped',
[SRC_DIR + '/wrapped.pyx'],
include_dirs=[INCLUDE_DIR],
library_dirs = [LIB_DIR],
libraries=['cfunc', 'MyLib']
)
if __name__ == "__main__":
setup(
install_requires=REQUIRES,
packages=PACKAGES,
name=NAME,
ext_modules=[ext],
cmdclass={"build_ext": build_ext}
)
但是当我编译我的Cython python setup.py build_ext
时,我得到了一个未解析的外部引用:
error LNK2001: unresolved external symbol __imp_LibFunction
正如我在other thread上发现的那样,似乎存在静态或动态库链接的问题。
我认为它来自setuptools编译选项,我尝试使用distutils documentation和Cython documentation进行调查。
问题是,我也尝试做我自己的C库(cfunc.lib,一个静态的),我设法在其中使用函数,就像我上面描述的那样。
我还在MyLib.lib上使用了DUMPBIN
,我找到了符号int __cdecl LibFunction(void)
,正如预期的那样,__imp_
不在符号中。
有人知道发生了什么,为什么会这样,以及如何解决我的问题它可能真的很有帮助!
答案 0 :(得分:1)
我终于找到了解决方案,所以如果有人在将来需要帮助我发布它!
我使用Visual Studio在Windows上编译代码。
即使我将我的productPageShow
项目创建为Visual C ++项目,它也不是作为C ++项目编译而是作为C项目编译,因此它默认工作(它只有.c和a .h文件)。
我的list
只包含C风格的函数声明,但是dll被编译为C ++项目,这就是为什么它无法工作,名称错误很糟糕。
所以我刚刚在cfunc
entrypoint.h