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!