自作の php extension を XAMPP で使う ( Mac OS X )

カテゴリー:
extensionphp
執筆者:
tanaka
日付:
2012.01.03

php extension を作ってみようと思い、一先ず helloworld.
そこまでは簡単にできたのですが、XAMPPで使おうとしたら動かない。。
なんでだろーと思って、調べていたら解決したのでメモしておきます。

以下のリンクを参考にやれば、コマンドラインで helloworld まで直ぐ出来ます。

一応やったことを書いておくと、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 MAMP

This 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.

TAG:
Mac OS Xphpphp extensionXAMPP

最近のエントリー

閉じる

カテゴリー

閉じる

アーカイブ

閉じる

執筆者

閉じる

TAG

閉じる