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

时间:2018-06-12 05:38:27

标签: php-extension

我收到了一个input[type=checkbox] { opacity: 0; padding-right: 10px (or whichever size that fits); } 文件,我无法查看它的源代码,我可以使用下一个命令编译我的c文件:

libxxx.so

gcc -ldl libxxx.so my.c -a a.out 在命令行中运行良好。但是在我将其包装到a.out扩展名后,PHP会显示如下消息:

PHP

xxxfunction是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 导出的函数。

我是libxxx.so的新手,我认为问题是编译我的C扩展程序的方式,我搜索谷歌但没有找到答案。
我想知道在 gcc 中是否有像 -ldl 这样的选项,所以我可以指定我将在我的{中使用libxxx.so {1}}延伸。
我按照后续步骤编译了我的扩展程序:

PHP

我已将PHP文件移至cd myextension/ phpize ./configure make make install 我的/etc/ld.so.conf:

libxxx.so

我已经破了/usr/local/lib

1 个答案:

答案 0 :(得分:1)

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

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

您应该将PHP_ADD_LIBRARY行放在PHP_NEW_EXTENSION文件中的config.m4宏之前的某个位置。此外,将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的第二个参数是一个函数,构建系统将检查它是否找到给定的库。