Python — 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++ вместо.

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

0

Решение

Чтобы заставить 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.

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,)
1