2017-04-20 96 views
2

我实际上正试图将现有的C库链接到我的Cython程序。Cython动态链接库

我访问声明为所有函数库的入口点头(.h):

EXPORT_API int _stdcall LibFunction(); 

我想用来创建__declspec(dllexport)该DLL EXPORT_API ...

我也有权访问.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_不在符号。

它有人发生了什么事情,为什么它是怎么回事,我怎么能解决我的问题,也可能是非常有帮助的想法!

回答

1

我终于找到了解决办法,所以我将它张贴如果有人需要在未来帮助!

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

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

我的entrypoint.h只包含C风格的函数声明,但dll被编译为C++项目,这就是为什么它不能工作,名称损坏是不好的。

所以我只是在我的setup.py

添加 language = 'c++'