( Kiskübi | 2011. 02. 22., k – 14:51 )

szz barátommal közben magánban beszéltünk, sikerült megoldani. :-)

Néhány észrevétel:

* Fontos fordításnál az -fpic paraméter, ha .so-k lesznek belőle.
* Nem minden doksi írta le, hogy a modult és a wrappert össze kell linkelni.
* Érdemes nézni az apacs hibanaplóját modul betöltésekor, ott nagyon sok minden kiderülhet.
* Érdemes nézni a phpinfo()-t, hogy betöltődött-e a modul.

Folyamat:

- zend API telepítése (Debianban php5-dev; az kell, amiben pl. a zend.h benne van)
- SWIG telepítése

- Érdemes egy Makefile-t írni, ami a wrapper-t generálja, elvégzi a két fordítást és a linkelést.
- C(++)-modul megírása
- interfészfájl megírása

- wrapper generálása

# swig -php interfész.i

Úgy látom, szól, ha valami hiba van. Ha nincs, előállítja a wrappert a Zend-hez, meg a PHP-include-ot.

- modul lefordítása

# gcc   -fpic -Wall   -o proba.o   -c proba.c

- wrapper lefordítása

# gcc   `php-config --includes`   -fpic -Wall   -o proba_wrap.o   -c proba_wrap.c

- Csatoljuk a kettőt, ráadásul dinamikus .so-t linkelünk belőle

# gcc   -shared   -o proba.so   proba.o proba_wrap.o

- Ezt a proba.so-t el kell helyezni oda, ahol a PHP megtalálja. Ez kész csomagokra nálam az /usr/lib/php5/20090626+lfs könyvtár, de én szívem szerint az /usr/local/lib/php5 alá teszem, amíg nem csinálok belőle .deb-csomagot, ekkor viszont a komplett útvonalat meg kell majd adni a konfigban, a következő lépésben.

- php-nak mondjuk meg, hogy van egy ilyen kiterjesztés. A php.ini nálam már darabolt, azaz /etc/php5/apache2/ini-ben való turkálás helyett már csinálhatok egy /etc/php5/conf.d/proba.ini fájlt. Ebbe az előzőek alapján útvonallal együtt:

extension=/usr/local/lib/php5/proba.so

- Apache újratöltése, pl.:

# tail -f /var/log/apache2/error.log

ENTER, ENTER, hogy tisztábban lássunk. :-)

Másik terminálon:

# /etc/inti.d/apache2 reload

No, itt a hibanaplóban fog megjelenni, hogy pl. nem találja a .so-t; találja, de nem definiáltál egy címkét (változót, függvényt, stb.); merthogy most történik meg a linkelés dinamikusan.

Ha szimbólumokkal kapcsolatos, vagy más linkelési hiba van, javítani kell a C-fájlt, vagy az interfészt, és onnan elölről... ha van Makefile, a make parancs pontosan azt gyártja újra, amit változáskor kell.

- Nézzünk PHP-ban egy phpinfo()-t. A modul nevére rákeresve ott kell legyen a kimeneten. :-)

Ha ez is jó volt, akkor már nekem működtek a függvények.