[Problem] PHP Erweiterungen schreiben in C unter Linux (mit Einbezug der Graphiklib Cairo)
-
Hallo,
ich habe unter linux eine php erweiterung in C geschrieben, welche auf methoden der graphiklib cairo (www.cairographics.org) zugreift. ich bin nach folgendem "tutorial" vorgegangen: http://devzone.zend.com/node/view/id/1021 ...
mein problem ist nun, dass zwar alles ohne warnings, errors etc kompiliert wird (wenn ich wie auf er verlinkten seite vorgehe mit phpize -> ./configure--enable-hello -> make ... ABER: wenn ich das php file, das die funktionen aufruft mit xampp (für linux) öffne, fragt mich der firefox browser jedesmal, ob ich die geöffnete php datei speichern will und es wird nichts angezeigt.
andere funktionen und erweiterungen, in denen keine Cairofunktionen aufgerufen werden, funktionieren tadelos.Liegt es evtl. daran, dass ich einfach nur die headerfiles für cairo in den ordner kopiert habe, wo die source bzw. zu kompilierende source datei steckt?
Hoffe, ihr könnt mir helfen!
Hier die Methode die nicht funktionieren will:
PHP_FUNCTION(paint_with_cairo) { long shape = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &shape) == FAILURE) { RETURN_NULL(); } cairo_t *cr; cairo_surface_t *surface; int x, y, count_rows,i; int width, height = 100; //surface = (cairo_surface_t *) cairo_svg_surface_create("Cairo_example.png", 1000.0, 1000.0); surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,2000,2000); //surface = (cairo_surface_t *) ("Cairo_example.svg", 2000.0, 2000.0); cr = cairo_create(surface); y = 1; count_rows = 0; for (i = 0; i < (numShapes); i++){ if(count_rows > 10){ y++; x = 0; count_rows = 0; } if(shape == 0){ cairo_rectangle(cr, x * 90, y * 70, 80, 55); }else if(shape == 1){ cairo_set_source_rgb(cr, 0.4, 0.5, 0.5); cairo_arc(cr, x*120+60, y*120+60, 60, 0, 2*M_PI); cairo_stroke_preserve(cr); cairo_set_source_rgb(cr, 0.5, 0.2, 0.1); cairo_fill(cr); }else{ cairo_move_to(cr, 80*x, 80*y); cairo_set_source_rgb(cr, 0.4, 0.5, 0.5); cairo_line_to(cr, 80*x, (80*y)+75); cairo_line_to(cr, (80*x)+75, (80*y)); cairo_line_to(cr, 80*x, 80*y); cairo_close_path(cr); } x++; count_rows++; } cairo_fill(cr); //cairo_set_source_rgb(cr, 0, 0, 0); cairo_surface_write_to_png(surface,"/opt/lampp/lampp/htdocs/bla/c_example.png"); cairo_destroy(cr); cairo_surface_destroy(surface); }
lg + danke,
into
-
intoxicated schrieb:
ABER: wenn ich das php file, das die funktionen aufruft mit xampp (für linux) öffne, fragt mich der firefox browser jedesmal, ob ich die geöffnete php datei speichern will und es wird nichts angezeigt.
Das ist meistens ein Zeichen, dass das PHP-Modul von Apache nicht geladen wurde. Durchstöber am besten mal die Logs.
intoxicated schrieb:
andere funktionen und erweiterungen, in denen keine Cairofunktionen aufgerufen werden, funktionieren tadelos.
Funktionieren andere PHP-Scripts, die nicht deine Funktion
paint_with_cairo ()
benutzen?intoxicated schrieb:
Liegt es evtl. daran, dass ich einfach nur die headerfiles für cairo in den ordner kopiert habe, wo die source bzw. zu kompilierende source datei steckt?
Sehr wahrscheinlich sogar, du musst auch die Libraries von Cairo gegen dein erzeugtes Modul Linken. Wie das mit phpize geht: keine Ahnung, einfach mal die Docs etwas genauer durchlesen.
-
danke für die antwort
... ja, andere php scripts funktionieren - es liegt nicht am server.
wegen den headerfiles: irgendwie verwirrt mich das ein wenig - wieso schreit der compiler nicht beim kompilieren? also anfangs, als ich die headerfiles noch nciht im sourceordner hatte, hat der compiler logischerweise die cairo funktionen nicht gefunden und fehler ausgegeben, aber wieso funktionierts jetzt ohne irgendwelche warnings, etc ...? also ich hab ja keine libs gelinkt - steh da jetzt ein wenig an, wie ich das machen soll mit dem linken der cairo lib... kannst du mir da weiter helfen?
lg
into
-
Das PHP-Modul ist im Endeffekt nur ein Shared Object (.so), und wenn das gelinkt wird, meckert der Compiler nicht wegen undefined references o.ä., weil diese ja evtl. im "Haupt-"Programm definiert sein könnten oder durch andere Libs, gegen die das Haupt-Programm gelinkt ist, aufgelöst werden könnten.
Und sorry, aber ich hab noch nie mit Zend/phpize gearbeitet und weiß auch nicht, wie man da die Libs einträgt, die zusätzlich gelinkt werden sollen.Wie gesgt, einfach mal die Docs durchstöbern.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.