PHPのExtensionのTips ― Ubuntu (20.04.3)での開発

PHPは既定のPHP 7.4.3を入れている前提です。

これまで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等)の定義

どうやらUbuntuPHPではCOMPILE_DL_MBSTRINGが定義されていないようで、そのためにphp_mb_convert_encoding等のAPIがExtention側にexposeされず、上のエラーになったようです。一方でCentOSPHP(remiのphp_config.h)ではCOMPILE_DL_MBSTRINGが定義されているため、CentOSでは問題なくビルドできたようです。

正しい対処方法かは分かりませんが、諸々のヘッダファイルをincludeする手前で、

#define COMPILE_DL_MBSTRING 1

を定義をしてやれば、正常にビルド/実行できます。