编写 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
、./configure
、make
和make 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
我在尝试编写使用外部共享库的 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
、./configure
、make
和make 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