我实际上是在尝试将现有的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