3

编辑:修改我的问题

在 C 中构建外部 PHP 模块时,如何链接共享对象?

4

1 回答 1

13

如果您的 C 扩展代码使用共享库,则需要在config.m4文件中声明它。

强烈建议使用ext_skelPHP 源代码中包含的脚本来生成骨架 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 的 Extending and Embedding PHP以及George Schlossnagle 的 Advanced PHP Programming 的一部分

Sara Goleman这里有一个合理的初学者指南来创建 PHP 扩展,但是你真的需要她的书。

于 2009-10-03T10:56:20.217 回答