如何使用静态库为 PHP 创建用 C++ 编写的扩展

问题描述

我正在为 PHP 编写一个扩展,我在创建模块、编译、在 Apache 中启用它并使标准示例工作时没有遇到很多问题。

修改认项目(添加一个带有方法属性的类,添加了要在PHPinfo中显示的信息,配置为接受c++,配置IDE CLion使用CMake中的命令构建项目)仍然没有问题.

当我尝试真正使用我的代码时,我的困难就开始了,我创建了一个静态库(我用 cunit 进行了单元测试,我通过 valgrind 没有任何问题)并且我尝试使用扩展,但它不起作用,我相信问题出在“config.m4”的配置上

如果我尝试使用 PHP_CHECK_LIBRARY,我会收到错误消息:

./configure: line 4787: unset: `ac_cv_lib_nerd4ever-kaya-wrapper_fn_kaya_login': not a valid identifier
configure: error: wrong nerd4eve-kaya lib not found

如果我直接包含项目编译的库,但在尝试加载时出错:

PHP_ADD_LIBRARY(nerd4ever-kaya-wrapper,1,KAYA_SHARED_LIBADD)

在apache中直接尝试包含库时出错

PHP Warning:  PHP Startup: Unable to load dynamic library 'kaya' (tried: /usr/lib/PHP/20180731/kaya (/usr/lib/PHP/20180731/kaya: cannot open shared object file: No such file or directory),/usr/lib/PHP/20180731/kaya.so (/usr/lib/PHP/20180731/kaya.so: undefined symbol: _ZN9nerd4ever4kaya9ExceptionD1Ev)) in UnkNown on line 0

我尝试使用命令“nm -C libnerd4ever-kaya-wrapper.a | less”检查库中的符号并显示 fn_kaya_login

kaya_client.cc.o:
...
00000000 T fn_kaya_login
...

我的 config.m4

PHP_ARG_ENABLE(kaya,whether to enable kaya support,[  --enable-kaya          Enable kaya support],no)

if test "$PHP_KAYA" != "no"; then
  PHP_ADD_INCLUDE(/usr/include)
  PHP_REQUIRE_CXX()

  PHP_ADD_LIBRARY(stdc++,KAYA_SHARED_LIBADD)
  PHP_ADD_LIBRARY(jsoncpp,KAYA_SHARED_LIBADD)
  PHP_ADD_LIBRARY(curl,KAYA_SHARED_LIBADD)

  KAYA_BASE_DIR="$KAYA_DIR./../.."
  AC_MSG_CHECKING(for kaya base dir)

  if [ test -d "$KAYA_BASE_DIR" ]; then
    dnl nerd4ever-kaya.a
    KAYA_LIBRARY_PATH=`find  $KAYA_BASE_DIR -type f -name "*nerd4ever-kaya-wrapper.a" | head -1 | xargs readlink -f | xargs dirname`

    if [ test -z "$KAYA_LIBRARY_PATH" ]; then
        AC_MSG_RESULT(["libs: not found"])
        AC_MSG_ERROR(["static lib kaya is required"])
    else
        AC_MSG_RESULT(["libs kaya: ${KAYA_LIBRARY_PATH}"])
        PHP_ADD_INCLUDE($KAYA_BASE_DIR/sources)
        PHP_ADD_LIBPATH($KAYA_LIBRARY_PATH)

   dnl    PHP_ADD_LIBRARY(nerd4ever-kaya-wrapper,KAYA_SHARED_LIBADD)
   dnl    PHP_CHECK_LIBRARY(nerd4ever-kaya-wrapper,fn_kaya_login,dnl    [
   dnl        PHP_ADD_LIBRARY(nerd4ever-kaya-wrapper,KAYA_SHARED_LIBADD)
   dnl        AC_DEFINE(HAVE_KAYA,[ Have kaya support ])
   dnl    ],[
   dnl        AC_MSG_ERROR([wrong nerd4eve-kaya lib not found])
   dnl    ],[
   dnl        -L$KAYA_LIBRARY_PATH -lnerd4ever-kaya-wrapper
   dnl    ])
   dnl    dnl PHP_ADD_LIBRARY_WITH_PATH(nerd4ever-kaya,KAYA_LIBRARY_PATH,EXTRA_LDFLAGS)
    fi
  fi
  PHP_SUBST(KAYA_SHARED_LIBADD)
  PHP_NEW_EXTENSION(kaya,PHP_kaya.cpp,$ext_shared,)
fi

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)