ひらい ぶらり Hi-Library

ぷろぐらみんぐについて。ときどきどうでもいいことについて。

MessagePackをPHPで使おうとしたら「undefined symbol: RETURN_NUL」ってでた

はい、お疲れ様です。
僕こと鬼チャラいプログラマーしんばしは困ったらすぐにGoogle先生に聞いてしまうのですが、マスターから「ルーク、ソースを使うのじゃ!」と言われてソースを眺めてみました。

無事MessagePackをmake installし、めでたしめでたし。さてテストしてみようとphpを走らせたところ

Warning: PHP Startup: Unable to load dynamic library 'modules/msgpack.so' - modules/msgpack.so: undefined symbol: RETURN_NUL in Unknown on line 0

こんなエラーが出ました。
なんぞ。
最後までひっしにGoogle先生で抵抗しましたが、出てきた記事は自分と同じ症状で困っているというコメントのみ。

\(^o^)/

でもまぁ今回は諦めるわけにはいかないのでマスターのお告げに従いソースを見てみました。

結論:RETURN_NUL じゃねぇ RETURN_NULLだ!

ということです。
とりあえずソースをみて/RETURN_NULと打ってRETURN_NULを探す。すると
RETURN_NUL()
RETURN_NULL()
という記述があることが分かります。
具体的には

447 PHP_MSGPACK_API void php_msgpack_unpack_limit(zval *return_value, const char *buf, int len, zend_bool assoc TSRMLS_DC) /* {{{ */
448 {
449     if (len<=0) {
450         RETURN_NUL();
451     }
509     if (!parameter_len) {
510         RETURN_NULL();
511     }
528     if (!parameter_len) {
529         RETURN_NULL();
530     }
542     if (len<=0) {
543         RETURN_NUL();
544     }
604     if (!data_len) {
605         RETURN_NULL();
606     }
624     if (!data_len) {
625         RETURN_NULL();
626     }

の6ヶ所。
そうですね、NULじゃないですよね。NULLですよね。

このうちの450行目と543行目のNULをNULLにすればOK。
vimなら

:%s/RETURN_NUL()/RETURN_NULL()/g

とでもすればいいんじゃないでしょうか。

再びmake, make install。
無事動きました。

めでたしめでたし。
早いところPECLとかで入れられるようになるといいなぁ。