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