【问题标题】:Linking a PHP Extension Written in C链接用 C 编写的 PHP 扩展
【发布时间】:2010-12-03 06:23:21
【问题描述】:

编辑:修改我的问题

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

【问题讨论】:

    标签: php automake php-extension php-internals


    【解决方案1】:

    如果您的 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 扩展的初学者指南,但是你真的需要她的书。

    【讨论】:

      猜你喜欢
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 1970-01-01
      • 2011-09-15
      相关资源
      最近更新 更多