2017-08-05 34 views
0

我编写的编辑距离称为edlib一个C模块链接错误,然后我把它在我的项目,从编译用Cython代码中调用的extern库

setup.py 
structureS.pyx 
cedlib.pxd 
cedlib 
|_____include 
     |______edlib.h 
|_____lib 
     |______edlib.lib 

但在运行python setup build_ext --inplace后,我已经连接的错误,在这里是代码,

#file:setup.py 
from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Build import cythonize 
ext_modules = [ 
    Extension(
     "structureS", 
     ["structureS.pyx"], 
     extra_compile_args=['/openmp'], 
     extra_link_args=['/openmp'], 
     include_dirs = ['edlib/include'], 
     #libraries = ['edlib'], 
     library_dirs = ['edlib/lib'], 
     # sources = ['edlib/src/edlibe.cpp'] 

    ) 
] 
setup(
    name='structureS', 
    ext_modules=cythonize(ext_modules), 
) 

的PXD文件是由模块作者在这个环节cedlib.pxd

#structureS.pyx 
from cedlib cimport EdlibAlignResult, edlibAlign, edlibDefaultAlignConfig,edlibFreeAlignResult 

cdef char* query = "ACCTCTG" 
cdef char* target = "ACTCTGAAA" 
cdef EdlibAlignResult result = edlibAlign(query, 7, target, 9, edlibDefaultAlignConfig()) 
if (result.status == 0): #EDLIB_STATUS_OK 
    printf("%d", result.editDistance) 

edlibFreeAlignResult(result) 
给出

这里是错误消息:

structureS.obj:错误LNK2001:symbole externe非解像度edlibFreeAlignResult

structureS.obj:错误LNK2001:symbole externe非解像度edlibAlign

structureS.obj :error LNK2001:symbole externe nonrésolu edlibDefaultAlignConfig

注意:我的项目是编译为64位平台,并为模块配置为32位平台,我试图编译模块为64位与Visual Studio 2017没有成功,

+2

为什么你评论'libraries = ['edlib'],'line? –

+0

,因为在我已经将头文件和库文件复制到编译器文件夹,所以我已经使用'库= ['edlib']',但与链接错误,我已经将文件复制到名为edlib文件夹上面的问题,我评论了你提到的这一行,我认为它在两种情况下都是一样的,所以问题不在于此 –

回答

2

我解决了它,直接编译C模块源与cython源,这里是解决方案

#file:setup.py 

from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Build import cythonize 
ext_modules = [ 
    Extension("structureS", 
     ["structureS.pyx", "edlib/src/edlib.cpp"], 
     include_dirs=["edlib/include"], 
     depends=["edlib/include/edlib.h"], 
     extra_compile_args=['/openmp'], 
     extra_link_args=['/openmp'], 
    ) 
] 
setup(
    name='structureS', 
    ext_modules=cythonize(ext_modules), 
)