C++, CGI & compiler

Hallo,

ich möchte ein c++ Programm als CGI auf eine webseite einbinden. Das (einfache Test-) Programm ist mit eclipse entwickelt, als webserver benutze ich apache, den ich auf meinem eigenen PC (Linux) betreibe. Compiler: intel c++.

Mein Problem: Das Programm läuft, wenn ich es direkt unter eclipse ausführe. Es läuft auch, wenn ich es unter der bash ausführe. Aber es läuft nicht, wenn ich es vom Browser aus ausführe. Natürlich kriege ich auch keine Fehlermeldung, die webseite bleibt einfach leer.

Wenn ich mit g++ compiliere, läuft das Programm auch auf dem webserver.

Eclipse kompiliert folgendermassen:

icpc -MMD -MP -MF"testprogram.d" -MT"testprogram.d" -c -o "testprogram.o" "../testprogram.cpp"
icpc -o"testprogram.cgi" ./testprogram.o 

Das Problem liegt wohl irgendwo bei irgenwelchen Pfaden.

Ist wohl unnötig zu erwähnen, dass ich Anfänger in diesem Gebiet bin, wäre also für jede Hilfe sehr dankbar.

Grüsse,
NI

Hallo,

Mein Problem: Das Programm läuft, wenn ich es direkt unter
eclipse ausführe. Es läuft auch, wenn ich es unter der bash
ausführe. Aber es läuft nicht, wenn ich es vom Browser aus
ausführe. Natürlich kriege ich auch keine Fehlermeldung, die
webseite bleibt einfach leer.

Die Fehlermeldung ist, falls es eine gibt, in /var/log/apache2/error.log

Log dich mal als user www-data (oder wie dein Apache-User heisst) ein und probiere das Programm dann von der Kommandozeile zu starten. Vielleicht kommen dann sinnvollere Fehlermeldungen.

HTH,
Moritz

Hallo,

ich möchte ein c++ Programm als CGI auf eine webseite
einbinden. Das (einfache Test-) Programm ist mit eclipse
entwickelt, als webserver benutze ich apache, den ich auf
meinem eigenen PC (Linux) betreibe. Compiler: intel c++.

Mein Problem: Das Programm läuft, wenn ich es direkt unter
eclipse ausführe. Es läuft auch, wenn ich es unter der bash
ausführe. Aber es läuft nicht, wenn ich es vom Browser aus
ausführe. Natürlich kriege ich auch keine Fehlermeldung, die
webseite bleibt einfach leer.

Wenn ich mit g++ compiliere, läuft das Programm auch auf dem
webserver.

Das Problem liegt wohl irgendwo bei irgenwelchen Pfaden.

Ist wohl unnötig zu erwähnen, dass ich Anfänger in diesem
Gebiet bin, wäre also für jede Hilfe sehr dankbar.

Ist der Webserver auf dem selben Rechner, auf dem
der Intel Compiler installiert wurde? Hast Du das
Programm statisch gelinkt, also im Makefile irgendwo:

 ...
 $(EXE): $(OBJFILES) $(TOOLFILES) $(XDEPEND)
 $(CXX) -o $@ $(OBJECTS)/\*.o **-static**
 ...

stehen?

Grüße

CMБ

Hallo,

zuerst mal herzlichen Dank euch beiden für die Antworten!

Das Problem ist etwas eingegrenzt. In der error.log steht folgendes:

[Wed Jun 04 13:23:57 2008] [error] [client —ip—] /var/www/apache2-default/cgi-bin/testprogram.cgi: error while loading shared libraries: libcxaguard.so.5: cannot open shared object file: No such file or directory, referer: http://—ip—/apache2-default/cgi-bin/
[Wed Jun 04 13:23:57 2008] [error] [client —ip—] Premature end of script headers: testprogram.cgi, referer: http://—ip—/apache2-default/cgi-bin/

Die erste Fehlermeldung tritt auch auf, wenn ich als www-data einlogge. In der .bashrc des „normalen“ Users habe ich folgende Zeile eingefügt:

if [-z „${LD_LIBRARY_PATH}“]
then
export LD_LIBRARY_PATH=/home/md/mkl/lib/32:/home/md/mkl/lib/64:/home/md/mkl/lib/em64t:/home/md/cc/lib
else
export LD_LIBRARY_PATH=/home/md/mkl/lib/32:/home/md/mkl/lib/64:/home/md/mkl/lib/em64t:/home/md/cc/lib:blush:LD_LIBRARY_PATH
fi

Offensichtlich muss ich für den www-data user eine ähnliche .bashrc einrichten. Nun ist www-data ein pseudo-user. Wie kann ich ihm diesen Pfad übergeben?

Die zweite Fehlermeldung ist wohl eine Folge davon, dass das Programm nicht ausgeführt werden kann.

Ist der Webserver auf dem selben Rechner, auf dem
der Intel Compiler installiert wurde? Hast Du das
Programm statisch gelinkt, also im Makefile irgendwo:


$(EXE): $(OBJFILES) $(TOOLFILES) $(XDEPEND)
$(CXX) -o $@ $(OBJECTS)/*.o
-static

stehen?

Der Webserver bedindet sich auf dem gleichen Rechner wie der compiler. Die static-Option habe ich im Makefile nicht gefunden (das file wird von eclipse automatisch generiert). Die relevanten Zeilen sind wohl:

testprogram: $(OBJS) $(USER\_OBJS)
icpc -o"testprogram" $(OBJS) $(USER\_OBJS) $(LIBS)

Siehe auch meine Antwort an Moritz.

Hallo,

if [-z „${LD_LIBRARY_PATH}“]
then
export
LD_LIBRARY_PATH=/home/md/mkl/lib/32:/home/md/mkl/lib/64:/home/md/mkl/lib/em64t:/home/md/cc/lib
else
export
LD_LIBRARY_PATH=/home/md/mkl/lib/32:/home/md/mkl/lib/64:/home/md/mkl/lib/em64t:/home/md/cc/lib:blush:LD_LIBRARY_PATH
fi

Offensichtlich muss ich für den www-data user eine ähnliche
.bashrc einrichten. Nun ist www-data ein pseudo-user. Wie kann
ich ihm diesen Pfad übergeben?

http://httpd.apache.org/docs/2.0/mod/mod_env.html
(SetEnv)

Grüße

CMБ

Fast unglaublich, aber das funktioniert tatsächlich!

In apache2.conf war folgende Zeile einzufügen:

SetEnv LD\_LIBRARY\_PATH "/home/md/mkl/lib/32:/home/md/mkl/lib/64:/home/md/mkl/lib/em64t:/home/md/cc/lib"

Nochmals herzlichen Dank!

Grüsse, NI