これまでCentOS 7で開発していたPHP Extensionを、Ubuntuでビルドしようとした際にエラー(Warning)が出ました。
warning: implicit declaration of function ‘php_mb_convert_encoding’ [-Wimplicit-function-declaration] 199 | php_mb_convert_encoding(input, len, to_enc, from_enc, out_len)
ざっくり言うと「php_mb_convert_encoding
の定義がありません」というエラーです。
ビルドするとsoファイルはできますが、実行するとやはりSegfaultになってしまいます。
ググっても情報が無く、仕方がないのでmbstring.hを見たところ、メインのAPI定義部分が以下のようなマクロで囲われてました。
// snip #ifdef COMPILE_DL_MBSTRING #undef HAVE_MBSTRING #define HAVE_MBSTRING 1 #endif // snip #if HAVE_MBSTRING ... API(php_mb_convert_encoding等)の定義
どうやらUbuntuのPHPではCOMPILE_DL_MBSTRING
が定義されていないようで、そのためにphp_mb_convert_encoding
等のAPIがExtention側にexposeされず、上のエラーになったようです。一方でCentOSのPHP(remiのphp_config.h)ではCOMPILE_DL_MBSTRING
が定義されているため、CentOSでは問題なくビルドできたようです。
正しい対処方法かは分かりませんが、諸々のヘッダファイルをincludeする手前で、
#define COMPILE_DL_MBSTRING 1
を定義をしてやれば、正常にビルド/実行できます。