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.logENTER, ENTER, hogy tisztábban lássunk. :-)
Másik terminálon:
# /etc/inti.d/apache2 reloadNo, 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.