Cython с C++ | Ошибка компиляции (заголовок C++ не найден) | Macos

Я пытаюсь реализовать очень простой код C++, используя Cython в macOS. Это заголовок моего кода 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++ вместо.

Что я здесь не так делаю? Я буду очень благодарен за помощь.

2 ответа

Решение

Чтобы заставить Cython генерировать и компилировать код C++ с помощью distutils, вам просто нужно передать параметр 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.

Это установочный файл, который работал для меня. Также я переименовал файл заголовка кода 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,)
Другие вопросы по тегам