首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在php扩展源码中加载自己的libxxx.so?

如何在php扩展源码中加载自己的libxxx.so?
EN

Stack Overflow用户
提问于 2018-06-12 13:38:27
回答 1查看 326关注 0票数 0

我得到了一个libxxx.so文件,我无法查看它的源代码,我可以用下面的命令编译我的c文件:

代码语言:javascript
复制
gcc -ldl libxxx.so my.c -a a.out

a.out在命令行中工作得很好。但在我将其封装到PHP扩展中后,PHP显示了如下消息:

代码语言:javascript
复制
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/myextension.so' - /usr/lib64/php/modules/myextension.so: undefined symbol: xxxfunction in Unknown on line 0

xxxfunction函数是由libxxx.so导出的函数。

我是C新手,我认为问题出在编译我的PHP扩展的方式上,我在谷歌上搜索了一下,但没有找到答案。

我想知道在gcc中是否有像-ldl这样的选项,这样我就可以指定在我的PHP扩展中使用libxxx.so。

我通过下一步编译了我的扩展:

代码语言:javascript
复制
cd myextension/
phpize
./configure
make
make install

我已将libxxx.so文件移动到/usr/local/lib

我的/etc/ld.so.conf:

代码语言:javascript
复制
include ld.so.conf.d/*.conf
/usr/local/lib

我已经运行了lddconfig

EN

回答 1

Stack Overflow用户

发布于 2018-06-13 06:43:41

您需要告诉构建系统在编译时链接到共享库。这允许依赖项存储在编译的PHP扩展中,它将在第一次使用时加载。

为此,您需要修改config.m4以添加库。您可以通过PHP_ADD_LIBRARY宏来执行此操作。此宏将一个库添加到链接行中,格式为PHP_ADD_LIBRARY($name,$append,$var)。第一个参数是库的名称;这是不带lib前缀的*.so文件的名称(例如xxx)。第二个参数决定(我假设)该行是被追加还是被覆盖;它通常应该设置为1。最后一个参数是存储该行的变量名。必须通过PHP_SUBST将此变量替换到输出文件中。

您应该将PHP_ADD_LIBRARY行放在config.m4文件中PHP_NEW_EXTENSION宏之前的某个位置。此外,将PHP_ADD_LIBRARY包装在PHP_CHECK_LIBRARY调用中也是一个好主意。这确保了在添加库之前,构建系统可以找到该库。请参见下面的示例。

Here是另一个和你的问题类似的问题。它有一些可供您参考的工作示例。此外,我将在这里提供一个快速示例:

代码语言:javascript
复制
PHP_CHECK_LIBRARY(xxx,xxxfunction,[
    PHP_ADD_LIBRARY(xxx,1,XXX_SHARED_LIBADD)
],[
    AC_MSG_ERROR([Please install libxxx on the system])
],
[])

PHP_SUBST([XXX_SHARED_LIBADD])

注意:PHP_CHECK_LIBRARY的第二个参数是一个函数,构建系统将检查该函数是否找到给定库。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50809909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档