编写 php 使用外部共享库的扩展

writing php extension that uses external shared library

我在尝试编写使用外部共享库的 php 扩展时遇到困难:

config.m4内容如下:

PHP_ARG_WITH([foo],
  [for foo support],
  [AS_HELP_STRING([--with-foo],
    [Include foo support])])

if test "$PHP_FOO" != "no"; then
  PKG_CHECK_MODULES([LIBFREETYPE2], [freetype2 >= 23.4.17])
  PHP_EVAL_INCLINE($LIBFREETYPE2_CFLAGS)
  PHP_EVAL_LIBLINE($LIBFREETYPE2_LIBS, FOO_SHARED_LIBADD)
  PHP_NEW_EXTENSION(foo, foo.c, $ext_shared)
fi

foo.c中main函数的代码如下(只是一个很简单的使用外部FreeType库的例子):

PHP_FUNCTION(foo_test) {
    ZEND_PARSE_PARAMETERS_NONE();

    FT_Library ft;

    if (FT_Init_FreeType(&ft)) {
        php_printf("FreeType library failed to load\n");
        return;
    }
    php_printf("FreeType library successfully loaded\n");

    FT_Done_Library(ft);
    php_printf("FreeType library unloaded\n");
}

phpize./configuremakemake install都成功了,然后我在php.ini:

中添加了扩展
extension = foo.so

到目前为止一切顺利,但是我 运行 下面的命令

echo "<?php foo_test();" | php

我收到以下错误消息:

php: symbol lookup error: /the-path-of-foo/foo.so: undefined symbol: FT_Init_FreeType

看起来 PHP 没有加载我的 PHP 扩展打算使用的外部共享 FreeType 库。

如何PHP加载外部共享 FreeType 库?

感谢您的帮助。

通过在 PHP_EVAL_LIBLINE($LIBFREETYPE2_LIBS, FOO_SHARED_LIBADD) 之后添加 PHP_SUBST(FOO_SHARED_LIBADD) 解决了这个问题:

PHP_ARG_WITH([foo],
  [for foo support],
  [AS_HELP_STRING([--with-foo],
    [Include foo support])])

if test "$PHP_FOO" != "no"; then
  PKG_CHECK_MODULES([LIBFREETYPE2], [freetype2 >= 23.4.17])
  PHP_EVAL_INCLINE($LIBFREETYPE2_CFLAGS)
  PHP_EVAL_LIBLINE($LIBFREETYPE2_LIBS, FOO_SHARED_LIBADD)
  PHP_SUBST(FOO_SHARED_LIBADD)
  PHP_NEW_EXTENSION(foo, foo.c, $ext_shared)
fi