我得到了一个libxxx.so
文件,我无法查看它的源代码,我可以用下面的命令编译我的c文件:
gcc -ldl libxxx.so my.c -a a.out
a.out
在命令行中工作得很好。但在我将其封装到PHP
扩展中后,PHP
显示了如下消息:
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。
我通过下一步编译了我的扩展:
cd myextension/
phpize
./configure
make
make install
我已将libxxx.so
文件移动到/usr/local/lib
。
我的/etc/ld.so.conf:
include ld.so.conf.d/*.conf
/usr/local/lib
我已经运行了lddconfig
。
发布于 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是另一个和你的问题类似的问题。它有一些可供您参考的工作示例。此外,我将在这里提供一个快速示例:
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
的第二个参数是一个函数,构建系统将检查该函数是否找到给定库。
https://stackoverflow.com/questions/50809909
复制相似问题