Cython,C ++和gsl

时间:2013-09-14 13:00:22

标签: c++ python cython gsl

所以我设置了一个c ++类,比如class.cpp,class.h。 class.cpp使用gsl中的一些函数(它有#include <gsl/gsl_blas.h>) 我没有问题将它链接到另一个c ++文件main.cpp,我可以用

编译它
g++ -o main main.o class.o  -I/home/gsl/include -lm -L/home/gsl/lib -lgsl -lgslcblas

此外,如果不在class.cpp中包含gsl库,我已经设法创建了一个在class.cpp中使用我的类的cython文件,它可以工作。

然而,当我尝试组合这两个(即在cython中使用c ++类,c ++类使用gsl函数)时,我不知道该怎么做。我想我必须包括

I/home/gsl/include -lm -L/home/gsl/lib -lgsl -lgslcblas

在安装文件中的某个地方,但我不知道在哪里或如何。我的setup.py看起来像

from distutils.core import setup
from Cython.Build import cythonize

import os

os.environ["CC"] = "g++"
os.environ["CXX"] = "g++"

setup(
    name = "cy",
    ext_modules = cythonize('cy.pyx'),
)

我有

# distutils: language = c++
# distutils: sources = class.cpp

在我的.pyx文件的开头。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我建议您在扩展程序中使用extra_compile_args选项。 我已经写了一些答案,幸运地使用了GSL依赖here

根据您的需求自定义,但它应该以这种方式工作。

希望这可以帮助...

答案 1 :(得分:1)

您可以使用libraries类的include_dirslibrary_dirsExtension参数指定所需的外部库。例如:

from distutils.extension import Extension
from distutils.core import setup
from Cython.Build import cythonize
import numpy

myext = Extension("myext",
                  sources=['myext.pyx', 'myext.cpp'],
                  include_dirs=[numpy.get_include(), '/path/to/gsl/include'],
                  library_dirs=['/path/to/gsl/lib'],
                  libraries=['m', 'gsl', 'gslcblas'],
                  language='c++',
                  extra_compile_args=["-std=c++11"],
                  extra_link_args=["-std=c++11"])
setup(name='myproject',
      ext_modules=cythonize([myext]))

这里,C ++类在myext.cppmyext.pyx中的cython接口中定义。另见:Cython Documentation