2017-08-05 1 views
0

j'ai compilé un module C appelé edlib pour la distance d'édition, puis je l'ai inclus dans mon projet,erreur reliant la compilation d'un code cython appelant bibliothèque extern

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

mais après l'exécution python setup build_ext --inplace j'ai relier erreur, ici est le code,

#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), 
) 

le fichier PXD a été donnée par l'auteur du module dans ce lien 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) 

ici est le message d'erreur:

structureS.obj: erreur LNK2001: non symbole externe edlibFreeAlignResult Résolu

structureS.obj: erreur LNK2001: non symbole externe edlibAlign Résolu

structureS.obj : erreur LNK2001: non symbole externe edlibDefaultAlignConfig Résolu

Note: mon projet est compilé pour la plate-forme 64 bits, et le module est configuré pour la plate-forme 32 bits, j'ai essayé de compiler le module pour 64bit avec Visual Studio 2017 sans succès,

+2

Pourquoi avez-vous commenté 'libraries = ['edlib'],' line? –

+0

car avant d'avoir copié le fichier d'en-tête et le fichier de bibliothèque dans le dossier du compilateur j'ai donc utilisé 'libraries = ['edlib']', mais avec les erreurs de liaison, j'ai copié les fichiers dans un dossier nommé edlib la question ci-dessus, et j'ai commenté la ligne que vous avez mentionné, je pense que c'est la même chose dans les deux cas, de sorte que le problème ne vient pas de cette –

Répondre

2

je l'ai résolu, en compilant directement la source du module C avec la source de Cython , voici la solution

#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), 
)