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

如何解决如何使用静态库为 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?