Envelopper C ++ lib avec Cython
Je suis nouveau sur Cython et je suis tring à utiliser Cython pour envelopper un C/C++ statique de la bibliothèque. J'ai fait simplement un exemple de la manière suivante.
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;
}
Ensuite, j'ai utilisé g++ pour compiler et construire.
g++ -c test.cpp -o libtest.o
ar rcs libtest.a libtest.o
Donc maintenant j'ai une bibliothèque statique appelé libtest.un.
Test.custode:
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
)
La je l'ai appelé:
python setup.py build_ext --compiler=mingw32 --inplace
La sortie a été:
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
llMain@12 --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
J'ai aussi essayé d'utiliser les bibliothèques=['test'] au lieu de bibliothèques=['libtest']. Il m'a donné les mêmes erreurs.
Aucune idée de toutes ces?
Merci!
source d'informationauteur YuQing Zhang
Vous devez vous connecter pour publier un commentaire.
Si votre code C++ est utilisé uniquement par le wrapper, une autre option est de laisser le programme d'installation de compiler votre .fichier cpp, comme ceci:
Pour la liaison à une bibliothèque statique, vous devez utiliser le extra_objects argument dans votre
Extension
:Votre
Test.pyx
fichier n'a pas fait ce que vous attendez. Leprint add(2,3)
ligne ne appeler leadd()
fonction C++; vous devez créer explicitement une fonction wrapper pour le faire. Cython ne pas créer des wrappers pour vous automatiquement.Quelque chose comme ceci est probablement ce que vous voulez:
Vous pouvez regarder Cython est la documentation pour plus de détails.
Je pense que vous pouvez résoudre ce problème en spécifiant le droit
library_dirs
(où vous avez réellement mettre libtest.un-apparemment, il n'est pas trouvé), mais je pense que vous aurez un autre problème, de vos points d'entrée ne sont pas correctement déclaré queextern "C"
de sorte que la fonction de l'noms ont été "déformés" par le compilateur C++ (regardez les noms de exportées à partir de votre libtest.un et vous verrez!), si une autre langue que le C++ (y compris C, Cython,...) vous avez des difficultés à faire à eux. La solution est de les déclarer commeextern "C"
.