2010-12-23 3 views
7

Nach Cython "Hello World" und das Beispiel der Aufruf einer Funktion in den C-Math-Bibliotheken here, was ich wirklich tun möchte, ist C-Code von mir in einer separaten Datei und benutze es von Cython. Nach this, ändere ich die setup.py-Datei:Cython: Aufruf Funktion von externen C-Datei

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

Dies ist hello2.c (Haupt nur da ist, sie separat zu kompilieren und testen --- obwohl das Produkt für den Test nicht vorhanden ist:

#import <stdio.h> 

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

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

Dies ist hello2_caller.pyx

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

cpdef myf(): 
    f() 

ich:

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

Also ich denke, ich versäume es, eine Kopfzeile in irgendeiner Weise bereitzustellen .. obwohl füttern Setup.py eine Standard-Header wie 'Hallo2.h' funktioniert nicht. Kannst du mich auf ein funktionierendes Beispiel hinweisen oder erklären, was ich falsch mache? Vielen Dank.

+0

Haben Sie versucht, den Header mit 'cdef extern von 'hello2..h':' anzugeben. AFAIK die Zeile 'extern' sollte nicht auf eine C-Datei, sondern auf eine Header-Datei verweisen. –

Antwort

4

Dank Hilfe von der Cython-Benutzerliste here.
Meine Writeup here.

Fazit: Dies ist nur eine Warnung, die nicht durch eine Deklaration von f() behoben wird, aber das kompilierte .so funktioniert. Ich bin mir immer noch nicht sicher, wie Sie Cython eine .h-Datei zur Verfügung stellen würden oder ob es einen besseren Weg dafür gibt.

Und es gibt ein paar Fehler: sollte #include sein, und die .c-Datei in sourcfiles nicht auflisten.