I'm new to Cython and I'm trying to use Cython to wrap a C/C++ static library. I made a simple example as follow.
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; }
Then I used g++ to compile and build it.
g++ -c test.cpp -o libtest.o ar rcs libtest.a libtest.o
So now I got a static library called 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 )
The I called:
python setup.py build_ext --compiler=mingw32 --inplace
The output was:
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
I also tried to use libraries=['test']
instead of libraries=['libtest']
. It gave me the same errors.
Any clue about this?
Cython improves the use of C-based third-party number-crunching libraries like NumPy. Because Cython code compiles to C, it can interact with those libraries directly, and take Python's bottlenecks out of the loop.
The Basics of CythonThe Cython compiler will convert it into C code which makes equivalent calls to the Python/C API. But Cython is much more than that, because parameters and variables can be declared to have C data types.
A number of widely used scientific computing libraries for Python — Pandas and SciPy — are also written in Cython. Also, Cython is currently being used by a number of high traffic websites including Quora.
The cimport statement is used in a definition or implementation file to gain access to names declared in another definition file. Its syntax exactly parallels that of the normal Python import statement. When pure python syntax is used, the same effect can be done by importing from special cython.
If your C++ code is only used by the wrapper, another option is to let the setup compile your .cpp file, like this:
from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext ext_modules = [Extension("test", ["test.pyx", "test.cpp"], language='c++', )] setup( name = 'test', cmdclass = {'build_ext': build_ext}, ext_modules = ext_modules )
For linking to a static library you have to use the extra_objects argument in your Extension
:
from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext ext_modules = [Extension("test", ["test.pyx"], language='c++', extra_objects=["libtest.a"], )] setup( name = 'test', cmdclass = {'build_ext': build_ext}, ext_modules = ext_modules )
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With