Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Wrap C++ lib with Cython

Tags:

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?

like image 615
YuQing Zhang Avatar asked Jan 20 '10 22:01

YuQing Zhang


People also ask

Does Cython use C or C++?

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.

Does Cython generate C code?

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.

Is Cython still used?

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.

What is Cimport Cython?

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.


1 Answers

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 ) 
like image 185
Luper Rouch Avatar answered Sep 24 '22 15:09

Luper Rouch