2010-12-23 18 views
7

Después de "Hello World" de Cython y el ejemplo de invocar una función en las bibliotecas matemáticas C here, lo que realmente quiero hacer es tener un código C en un archivo aparte y usarlo desde Cython. Siguiendo this, modifico el archivo setup.py:Cython: función de llamada desde el archivo C externo

sourcefiles = ['hello2_caller.pyx', 'hello2.c'] 

Ésta es hello2.c (principal está ahí sólo para compilar y probar por separado --- sin embargo, que el producto no está presente para el examen:

#import <stdio.h> 

void f() { 
    printf("%s", "Hello world!\n"); 
} 

int main(int argc, const char* argv[]) { 
    f(); 
    return 0; 
} 

Esta es hello2_caller.pyx

cdef extern from "hello2.c": 
    void f() 

cpdef myf(): 
    f() 

me sale:

In file included from hello2_caller.c:219: 
hello2.c:3: warning: function declaration isn’t a prototype 

Así que supongo que no proporcionaré un encabezado de alguna manera ... aunque alimentar a setup.py un encabezado estándar como 'hello2.h' no funciona. ¿Puede señalarme un ejemplo de trabajo o explicar lo que estoy haciendo mal? Gracias.

+0

¿Has intentado especificar el encabezado con 'cdef extern from" hello2..h ":'. AFAIK la línea 'extern' no debe referirse a un archivo C sino a un archivo de encabezado. –

Respuesta

4

Gracias a la ayuda de la lista de usuarios de Cython here.
Mi descripción here.

En pocas palabras: esto es solo una advertencia, que no se soluciona con una declaración de f(), pero el compilado .so funciona. Todavía no estoy seguro de cómo proporcionaría un archivo .h a Cython o si hay una forma mejor de hacerlo.

Y hay un par de errores: debe ser #include, y no enlistar el archivo .c en archivos_sourcfiles.

Cuestiones relacionadas