1

我正在尝试在 macOS 中使用 Cython 实现一个非常简单的 C++ 代码。这是我的 C++ 代码的标头(它是一个名为cs_test.h

#include<iostream>
void cs_test(int n);

这是我的 C++ 代码(文件名cs_test.cpp::

#include "cs_test.h"
using namespace std;

int main(){}

void cs_test(int n)
{
    cout << "This is C++ output: " << n << endl;
}

这是我的pyx代码(文件名simulate.pyx:)

import numpy as np
cimport numpy as np

cdef extern from "./cauchy.h" nogil:
void cs_test(int n)

def sim():
    cs_test(5)

最后,这是我的设置代码 ( setup.py)

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

setup(
    ext_modules=cythonize("simulate.pyx"),
    include_dirs=[numpy.get_include()]
)  

所有上述文件都在同一个文件夹中。我setup.py使用以下命令运行:

python setup.py build_ext --inplace

而且,我收到以下错误消息:

In file included from simulate.c:502:0:
./cauchy.h:1:19: fatal error: iostream: No such file or directory
compilation terminated.
error: command 'gcc' failed with exit status 1

simulate.pyx中,即使我将行替换为cdef extern from "./cauchy.h" nogil:cdef extern from "cauchy.h" nogil:我仍然会收到相同的错误消息。我了解有关使用的错误消息gcc可能是因为我正在使用 macOS。但是,我不知道如何让代码知道使用clang++c++代替。

我在这里做错了什么?我将非常感谢您的帮助。

4

2 回答 2

1

这是对我有用的安装文件。我还重命名了 C++ 代码的头文件以匹配 C++ 文件的名称。

import numpy
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [Extension(
    name="simulate_cy",
    sources=["simulate.pyx", "cs_test.cpp"],
    # extra_objects=["fc.o"],  # if you compile fc.cpp separately
    include_dirs = [numpy.get_include()],  # .../site-
packages/numpy/core/include
    language="c++",
    # libraries=
    extra_compile_args = ['-O3'],
    # extra_link_args = "...".)
    )]

setup(
    name = 'simulate_cy',
    cmdclass = {'build_ext': build_ext},
    ext_modules = ext_modules,)
于 2018-02-27T01:14:24.653 回答
1

要使 Cython 使用 distutils 生成和编译 C++ 代码,您只需要传递选项language="c++"

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

setup(ext_modules = cythonize(
       "rect.pyx",                 # our Cython source
       sources=["Rectangle.cpp"],  # additional source file(s)
       language="c++",             # generate C++ code
  ))

这在使用 C++ 和 Cython 的文档页面上有明确说明。

于 2018-02-27T01:18:47.200 回答