【发布时间】:2010-12-03 06:23:21
【问题描述】:
编辑:修改我的问题
在 C 中构建外部 PHP 模块时,如何链接共享对象?
【问题讨论】:
标签: php automake php-extension php-internals
编辑:修改我的问题
在 C 中构建外部 PHP 模块时,如何链接共享对象?
【问题讨论】:
标签: php automake php-extension php-internals
如果您的 C 扩展代码使用共享库,则需要在 config.m4 文件中声明。
我强烈建议使用 PHP 源代码中包含的 ext_skel 脚本来生成骨架 config.m4:
./ext_skel --extname=myextension
由于您要链接到库,按照惯例,您应该使用--with-myextension 选项(而不是--enable-myextension)。取消config.m4中相关行的注释,填写你的lib的详细信息。
类似于以下内容:
# --with-myextension -> check for lib and symbol presence
LIBNAME=the_lib_your_extension_needs # you may want to change this
LIBSYMBOL=some_symbol_in_the_lib_you_extension_needs # you most likely want to change this
PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
[
PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $MYEXTENSION_DIR/lib, MYEXTENSION_SHARED_LIBADD)
AC_DEFINE(HAVE_MYEXTENSIONLIB,1,[ ])
],[
AC_MSG_ERROR([wrong $LIBNAME lib version or lib not found])
],[
-L$MYEXTENSION_DIR/lib -ldl
])
然后构建它,运行:
phpize
./configure --with-myextension
make
最后,您需要将您的模块(或ln -s)复制到您的系统期望找到的任何位置。
如果一切正常,那么php -m 应该将您的模块包含在列表中。
不幸的是,我从来没有找到关于 PHP 的 config.m4 命令的良好在线参考 - 这方面的书籍是 Sara Golemon's Extending and Embedding PHP 以及 George Schlossnagle's Advanced PHP Programming 的一部分。
Sara Goleman here 提供了一个合理的创建 PHP 扩展的初学者指南,但是你真的需要她的书。
【讨论】: