我实际上是在尝试将现有的C库链接到我的Cython程序。

我可以使用以下声明为所有函数的方式访问该库的入口点标头(.h):

EXPORT_API int _stdcall LibFunction();


我想EXPORT_API用于用__declspec(dllexport)创建dll ...

我还可以访问.lib和.dll文件。

我尝试将此函数与Cython的通常cdef extern from结合使用:

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_

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

最佳答案

我终于找到了解决方案,因此如果将来有人需要帮助,我可以将其发布!

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

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

我的entrypoint.h仅包含C样式的函数声明,但dll被编译为C ++项目,这就是为什么它无法工作的原因,名称处理不正确。

所以我只是在language = 'c++'中添加了setup.py

10-08 08:13
查看更多