【问题标题】:writing php extension that uses external shared library编写使用外部共享库的 php 扩展
【发布时间】:2021-04-15 17:36:50
【问题描述】:

我在尝试编写使用外部共享库的 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:符号查找错误:/the-path-of-foo/foo.so:未定义符号: FT_Init_FreeType

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

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

感谢您的帮助。

【问题讨论】:

    标签: php php-extension freetype


    【解决方案1】:

    通过在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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多