2017-04-20 7 views
2

Ich versuche tatsächlich, eine vorhandene C-Bibliothek zu meinem Cython-Programm zu verknüpfen.Cython dynamische Bibliothek Verknüpfung

Ich habe Zugang zu den Einstiegspunkt Header (H) der Bibliothek mit allen Funktionen deklariert als:

EXPORT_API int _stdcall LibFunction(); 

ich die EXPORT_API nehme verwendet wird, um die DLL mit __declspec(dllexport) zu erstellen ...

Ich habe auch Zugriff auf die .lib- und .dll-Dateien.

Ich habe versucht, diese Funktion mit dem üblichen cdef extern from von Cython zu verwenden:

cdef extern from "include\\entrypoint.h": 
    int LibFunction() 

def c_LibFunction(): 
    LibFunction() 

Und ich bin mit dem folgenden 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} 
      ) 

Aber wenn ich meine Cython kompilieren python setup.py build_ext ich erhalte eine ungelöste externe Referenz:

error LNK2001: unresolved external symbol __imp_LibFunction

Wie ich auf other thread gefunden habe, scheint es so eine Frage der statischen oder dynamischen Bibliotheksverknüpfung zu sein.

Ich denke, es kommt von den SetupTools Compiling-Optionen, ich versuchte zu untersuchen, mit Distutils documentation und Cython documentation.

Die Sache ist, ich habe auch versucht, meine eigene C-Bibliothek (cfunc.lib, eine statische) zu tun, und ich habe es geschafft, Funktion in der gleichen Weise wie ich oben beschrieben.

Ich auch DUMPBIN auf MyLib.lib und ich fand das Symbol int __cdecl LibFunction(void) und wie erwartet, ist die __imp_ nicht im Symbol.

Es hat jemand eine Idee von dem, was los ist, warum es passiert und wie ich mein Problem lösen kann, es könnte wirklich hilfreich sein!

Antwort

1

Ich habe endlich die Lösung gefunden, also poste ich es, wenn jemand Hilfe in der Zukunft braucht!

Ich arbeite unter Windows mit Visual Studio, um meinen Code zu kompilieren.

Auch wenn ich mein cfunc-Projekt als ein Visual C++ - Projekt erstellte, kompilierte es nicht als C++ - Projekt, sondern als C-Projekt, so dass es standardmäßig funktionierte (es hat nur eine .c- und eine .h-Datei).

Meine entrypoint.h enthält nur C-Stil Funktionsdeklaration, aber die DLL ist als C++ - Projekt kompiliert, deshalb konnte es nicht funktionieren, der Name Mangling war schlecht.

Also habe ich gerade language = 'c++' in meinem setup.py

hinzugefügt
Verwandte Themen