Ошибка компиляции Cython с заголовочными файлами C

Поэтому я пытаюсь обернуть немного кода C с помощью Cython. Я прочитал читать прикладные уроки Cython по этому вопросу (1, 2), но в этих руководствах не говорится много о том, как скомпилировать код после того, как вы обернули его в Cython, и поэтому у меня есть ошибка, говорящая, что он не может найти мой C-код.

Во-первых, мой сценарий Cython («calcRMSD.pyx»):

import numpy as np
cimport numpy as np

cdef extern from "rsmd.h":
double rmsd(int n, double* x, double* y)

#rest of the code ommited

Код C, который я пытаюсь обернуть («rmsd.h»):

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

extern "C" {
// svd from lapack
void dgesvd_(char*,char*,int*,int*,double*,int*,double*,double*,int*,double*,
int*,double*,int*,int*);
}

double rmsd(int n, double* x, double* y)
{
//code omitted
}

Setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
from Cython.Build import cythonize
import numpy as npsetup(
ext_modules = cythonize([Extension("calcRMSD",
sources = ["calcRMSD.pyx"],
include_dirs = [np.get_include()],
libraries = ["dgesvd"]
#extra_compile_args = ["-I."],
#extra_link_args = ["-L./usr/lib/liblapack.dylib"]
)])

)

Моя ошибка:

calcRMSD.c:269:10: fatal error: 'rsmd.h' file not found
#include "rsmd.h"

Я прочитал этот поток переполнения стека
Использование Cython для связи Python с общей библиотекой

но после этого я получаю разные ошибки. Если я пытаюсь поместить rmsd.h в исходные тексты, он говорит, что не распознает тип файла.

Как связать пользовательский C (которому для компиляции нужны специальные опции связывания) с Cython?

Это выглядит несколько многообещающе, но я не уверен, как его использовать.

Пожалуйста помоги!

4

Решение

Прежде всего, он должен найти включаемый файл, rsmd.h, Вам нужно добавить путь, где этот заголовок может быть найден в include_dirs параметр. Ошибка об отсутствующем файле должна исчезнуть.

Затем вам нужно будет добавить библиотеку, которую вы получите от компиляции этого кода на языке Си. Если это librsmd.a ты бы добавил 'rsmd' к libraries параметр. Кроме того, вам может понадобиться library_dirs параметр, который содержит путь, где эта библиотека может быть найдена.

4

Другие решения


По вопросам рекламы [email protected]