自作の php extension を XAMPP で使う ( Mac OS X )
php extension を作ってみようと思い、一先ず helloworld.
そこまでは簡単にできたのですが、XAMPPで使おうとしたら動かない。。
なんでだろーと思って、調べていたら解決したのでメモしておきます。
以下のリンクを参考にやれば、コマンドラインで helloworld まで直ぐ出来ます。
- PHP Extension を作ろう第1回 - まずは Hello World
- Hello, World! するだけの PHP Extension を作る
- 魔法少女好きだったらわかるphp拡張の作り方。
一応やったことを書いておくと、http://www.php.net/releases/ から 5.3.1をDLして解凍、
$ cd php-5.3.1/ext $ ./ext_skel --extname=helloworld $ cd helloworld $ phpize $ ./configure $ make
すると modules/helloworld.so のできあがりですね。( make install はしない )
上記のblog記事に習って helloworld関数を追加してみたので、
$ php -d extension=modules/helloworld.so -r "helloworld();" Hello, World!
となるのだけど、helloworld.so を
/Applications/XAMPP/xamppfiles/lib/php/php-5.3.1/extensions/no-debug-non-zts-20090626/helloworld.so
にコピーして
/Applications/XAMPP/xamppfiles/etc/php.ini
に
extension=helloworld.so
を追記しても
XAMPPでApache立ち上げて helloworld(); ができない。
できないというか、helloworld() なんてねーよ、と言われる。
/Applications/XAMPP/xamppfiles/logs/error_log を見てみたら、
PHP Warning: PHP Startup: Unable to load dynamic library '/Applications/XAMPP/xamppfiles/lib/php/php-5.3.1/extensions/no-debug-non-zts-20090626/helloworld.so' - dlopen(/Applications/XAMPP/xamppfiles/lib/php/php-5.3.1/extensions/no-debug-non-zts-20090626/helloworld.so, 9): no suitable image found. Did find:\n\t/Applications/XAMPP/xamppfiles/lib/php/php-5.3.1/extensions/no-debug-non-zts-20090626/helloworld.so: mach-o, but wrong architecture in Unknown on line 0
ってエラー出てますね。
I guess it's probbaly because php is not build in 64 bit, so you are trying to load a 64 bit module to a 32 bit application and of course it won't work.You can check this by running file on php binary (or php module if used as module)
memcache.so, wrong architecture in Unknown on line 0 in MAMPThis line looks just a bit complicated because it tries to deal with architecture problems between XAMPP (compiled for 32bit) and Snow Leopard (compiles everything by default to 64bit)
Develop memcached web apps with XAMPP under Mac OS X
調べていると上記記事を見つけたので、試しに fileしてみると、
$ file modules/helloworld.so modules/helloworld.so: Mach-O 64-bit bundle x86_64
確かに64bit.
なるほど、XAMPP(32bit)用にコンパイルすればいいですね。
というわけで、
$ ./configure CFLAGS='-arch i386'
と指定し、make すれば、目出度く
$ file modules/helloworld.so modules/helloworld.so: Mach-O bundle i386
となる。
この helloworld.so であれば、XAMPPでも helloworld(); できる。( 逆にコマンドラインではエラー )
また、
$ ./configure CFLAGS='-arch i386 -arch x86_64'
と指定すれば、
$ file modules/helloworld.so modules/helloworld.so: Mach-O universal binary with 2 architectures modules/helloworld.so (for architecture i386): Mach-O bundle i386 modules/helloworld.so (for architecture x86_64): Mach-O 64-bit bundle x86_64
となりどちらでもOK.