Nicht definierte Verweise

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Casisto
User
Beiträge: 12
Registriert: Sonntag 20. Oktober 2013, 13:11

Hallo Forum,

ich möchte momentan ein Python-Programm in C einbinden. Zum testen halte ich mich an
http://openbook.galileocomputing.de/pyt ... 26_003.htm

Nun habe ich folgenden Quellcode erzeugt:

Code: Alles auswählen

#include "py/Python.h"
const char *programm = 
"import random\n" 
"print 'Guten Tag, die Zahl ist:', random.randint(0, 100)\n" 
"print 'Das war ... Python'\n";

int main(int argc, char *argv[]) 
{ 
    Py_Initialize(); 
    PyRun_SimpleString(programm); 
    Py_Finalize(); 
}
Unter C++ bekomme ich die Fehlermeldungen:
/tmp/ccCiz6WV.o: In Funktion `main':
Test1.cpp:(.text+0xa): Nicht definierter Verweis auf `Py_Initialize'
Test1.cpp:(.text+0x1f): Nicht definierter Verweis auf `PyRun_SimpleStringFlags'
Test1.cpp:(.text+0x24): Nicht definierter Verweis auf `Py_Finalize'
collect2: error: ld returned 1 exit status
und beim probieren unter C:
/bin/sh: 1: Syntax error: EOF in backquote substitution
Ich hoffe ihr könnt mir weiterhelfen. C++ ist wichtiger.

Die erste Zeile:

Code: Alles auswählen

#include "py/Python.h"
heißt übrigens das ich in dem Verzeichnis in dem auch die Cpp liegt einen Ordner habe in dem ich die Heder aus der libdev für Python 2.7.5 reingeschoben habe. Natürlich habe ich diese auch installiert, aber sonst findet er diese nicht.
Mit

Code: Alles auswählen

#include "python2.7/Python.h"
kommen aber auch die gleichen Fehlermeldungen.

Grüße
Casisto
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Casisto: Du mußt schon auch gegen die Python-Library linken.
BlackJack

@Casisto: Man kopiert keine Headerdateien in der Gegend herum, sondern sagt dem Compiler wo er sie finden kann. Wie man das genau macht hängt vom C-Compiler ab. Deshalb steht dazu wahrscheinlich auch nichts im Buch. Bei GCC oder clang gibt es dazu die ``-I``-Option.

Dafür bei jedem Programm den Quelltext ändern und/oder die Header-Dateien kopieren wäre ziemlich aufwändig und chaotisch.

Wenn Du Python in ein C-Programm einbinden willst, warum verwendest Du dann einen C++-Compiler? C und C++ sind sehr unterschiedliche Sprachen mit sehr ähnlicher Syntax. Solange man sich nicht sicher ist, dass die eingebundenen C-Header dafür sorgen dass ihr Inhalt in einem ``extern "C" { … }``-Block eingefasst sind, wenn sie von einem C++-Compiler eingebunden werden, muss man das Beispielsweise selber machen. Die Python-Header machen das, aber so etwas sollte man vorher abklären und nicht hoffen das es funktioniert.

Die Fehlermeldung beim C-Compiler kann ich nicht nachvollziehen. Bei beiden Compilern sollte die gleiche Fehlermeldung kommen, nämlich das die Referenzen nicht aufgelöst werden können, weil man dem Compiler auch explizit sagen muss gegen welche ``libpython`` er linken soll. Wie man das macht ist auch von Compiler zu Compiler unterschiedlich. Beim GCC und clang gibt es wieder eine Option dafür (``-l``), wo man den Bibliotheksnamen angibt. Minimal könnte der Aufruf zum Beispiel so aussehen:

Code: Alles auswählen

$ clang test2.c -I/usr/include/python2.7 -lpython2.7
$ ./a.out 
Guten Tag, die Zahl ist: 93
Das war ... Python
Das mit den beiden Optionen steht in dem verlinkten Buchkapitel direkt im Text zu dem Beispielprogramm! Du musst vielleicht ein bisschen gründlicher den Text lesen.
Casisto
User
Beiträge: 12
Registriert: Sonntag 20. Oktober 2013, 13:11

@BlackJack,

das war als eine schnelle Lösung gedacht. Es soll auch ein C++-Programm rauskommen (wie oben beschrieben). Ich habe nur schnell das Beispiel aus dem Buch verwenden wollen um zu schauen wie es grundsätzlich funktioniert bevor ich meine eigene Funktion einbinde.

Ich meld mich heute Abend nochmal wenn ich das Linken probiert habe.
Casisto
User
Beiträge: 12
Registriert: Sonntag 20. Oktober 2013, 13:11

So, jetzt klappt alles...

Erst in der Kommandozeile, jetzt auch in Geany.

Vielen Dank für die Hilfe!
Antworten