php - 链接用 C 编写的 PHP 扩展

标签 php automake php-extension php-internals

编辑:修改我的问题

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

最佳答案

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

强烈推荐使用 ext_skel包含在 PHP 源代码中的用于生成框架 config.m4 的脚本:

./ext_skel --extname=myextension

由于您要链接到一个库,按照惯例您应该使用 --with-myextension 选项(而不是 --enable-myextension)。取消注释 config.m4 中的相关行并填写您的库的详细信息。

类似下面的内容:

  # --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 为创建 PHP 扩展提供了合理的初学者指南 here , 但对于肉你真的需要她的书。

关于php - 链接用 C 编写的 PHP 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1508430/

相关文章:

php - 如何将数组传递给 mysql 语句

java - 如何使用 JSON 将字符串从 android 传递和读取到 sql

php - 构建 PHP 扩展时如何通过 config.m4 添加额外的参数?

php - 为什么缓存查询时不缓存关系?

php - 我应该如何创建一个总是超时的测试资源

git - "make clean"不清除与 Automake 的依赖关系?

gnu-make - 如何访问 Makefile.am 文件顶部定义的用户定义变量?

automake - libtool 不提供要链接的库依赖项

php - 如何在 php 扩展中包装 c++ 类?

php-extension - 安装mailparse php7 mbstring错误