Cython动态库链接

时间:2017-04-20 14:05:59

标签: python dll cython

我实际上是想将现有的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_不在符号中。

有人知道发生了什么,为什么会这样,以及如何解决我的问题它可能真的很有帮助!

1 个答案:

答案 0 :(得分:1)

我终于找到了解决方案,所以如果有人在将来需要帮助我发布它!

我使用Visual Studio在Windows上编译代码。

即使我将我的productPageShow项目创建为Visual C ++项目,它也不是作为C ++项目编译而是作为C项目编译,因此它默认工作(它只有.c和a .h文件)。

我的list只包含C风格的函数声明,但是dll被编译为C ++项目,这就是为什么它无法工作,名称错误很糟糕。

所以我刚刚在cfunc

中添加了entrypoint.h