Así que estoy tratando de envolver un código C con Cython. Leí los tutoriales de Cython aplicados sobre cómo hacer esto ( 1 , 2 ), pero estos tutoriales no dicen mucho sobre cómo compilar el código una vez que lo haya envuelto con Cython, por lo que tengo un error que dice que no puede encontrar mi C código.
Primero, mi secuencia de comandos 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 ommitedEl código C que estoy tratando de envolver ("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 }Configuración.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 np setup( 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"] )]) )Mi error:
calcRMSD.c:269:10: fatal error: 'rsmd.h' file not found #include "rsmd.h"Leí este hilo de desbordamiento de pila Usando Cython para vincular Python a una biblioteca compartida
pero seguirlo me da diferentes errores. Si trato de poner rmsd.h en las fuentes, dice que no reconoce el tipo de archivo.
Esto parece algo prometedor, pero no estoy seguro de cómo usarlo.
¡Por favor ayuda!
En primer lugar, debe encontrar el archivo de inclusión, rsmd.h Debe agregar la ruta donde se puede encontrar este encabezado al parámetro include_dirs . El error sobre el archivo que falta debería desaparecer.
Luego, además, deberá incluir la biblioteca que obtiene al compilar ese código C. Si eso es librsmd.a , agregaría 'rsmd' al parámetro de libraries . Además, es posible que necesite un parámetro library_dirs que contenga la ruta donde se puede encontrar esa biblioteca.