Ich bin neu in Cython und ich versuche Cython zu verwenden, um eine C/C++ statische Bibliothek zu wickeln. Ich habe ein einfaches Beispiel wie folgt gemacht.Wrap C++ - Lib mit Cython
Test.h:
#ifndef TEST_H
#define TEST_H
int add(int a, int b);
int multipy(int a, int b);
#endif
Test.cpp
#include "test.h"
int add(int a, int b)
{
return a+b;
}
int multipy(int a, int b)
{
return a*b;
}
Dann habe ich g ++, es zu kompilieren und zu bauen.
g++ -c test.cpp -o libtest.o
ar rcs libtest.a libtest.o
So jetzt habe ich eine statische Bibliothek namens libtest.a.
Test.pyx:
cdef extern from "test.h":
int add(int a,int b)
int multipy(int a,int b)
print add(2,3)
Setup.py:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [Extension("test",
["test.pyx"],
language='c++',
include_dirs=[r'.'],
library_dirs=[r'.'],
libraries=['libtest']
)]
setup(
name = 'test',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules
)
Die ich rief:
python setup.py build_ext --compiler=mingw32 --inplace
Der Ausgang war:
running build_ext
cythoning test.pyx to test.cpp
building 'test' extension
creating build
creating build\temp.win32-2.6
creating build\temp.win32-2.6\Release
C:\Program Files\pythonxy\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -I. -IC:\
Python26\include -IC:\Python26\PC -c test.cpp -o build\temp.win32-2.6\Release\test.o
writing build\temp.win32-2.6\Release\test.def
C:\Program Files\pythonxy\mingw\bin\g++.exe -mno-cygwin -mdll -static --entry _D
[email protected] --output-lib build\temp.win32-2.6\Release\libtest.a --def build\temp.w
in32-2.6\Release\test.def -s build\temp.win32-2.6\Release\test.o -L. -LC:\Python
26\libs -LC:\Python26\PCbuild -ltest -lpython26 -lmsvcr90 -o test.pyd
g++: build\temp.win32-2.6\Release\libtest.a: No such file or directory
error: command 'g++' failed with exit status 1
Ich habe auch versucht, Bibliotheken = ['Test'] anstelle von Bibliotheken = ['libtest'] zu verwenden. Es gab mir die gleichen Fehler.
Irgendwelche Hinweise auf diese?
Danke!
Wo soll ich extern "C" deklarieren?Allerdings denke ich, das Problem ist jetzt, dass der Build klagt, dass er libtest.a statt einer der Funktionen, d. H. Add() oder multipy(), nicht finden kann. Ich bin mir also nicht sicher, ob das funktioniert. Es ist ziemlich komisch für mich, dass es beschwert hat, dass es keine libtest.a in 'build \ temp.win32-2.6 \ Release' gibt. Ist das nicht der Build-Ordner, der von Cython selbst generiert wird? Warum hat Cython versucht, dort nach dem libbtest.a zu suchen? –
'extern" C "geht in den Deklarationen der Funktionen in der' .h', und wie ich schon sagte, das ist das nächste Problem, das Sie konfrontiert werden, nachdem Sie die falschen 'library_dirs' (Sie sagen Bibliotheken sind" im aktuellen Verzeichnis "und das' Release' ist zufällig das aktuelle Verzeichnis zu dem Zeitpunkt, zu dem der Compiler/Linker nach der Bibliothek sucht. " –