4

所以我用class.cpp,class.h建立了一个c++类。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 文件的开头。

谢谢你的帮助!

4

2 回答 2

1

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

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

希望这可以帮助...

于 2013-09-18T18:03:14.293 回答
1

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

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.cpp,cython 接口定义在myext.pyx. 另请参阅:Cython 文档

于 2017-08-30T07:39:29.593 回答