PHP_FE_FUNCTION:尝试启用扩展时发生C错误

我有一个关于PHP的问题。 我使用Ubuntu,但我有不同的PHP构build,我自己在/ opt / php。 当启用一个扩展做下面的简介时,我有一个问题(使用PHP 5.3.8)

cd my-ext /opt/php/5.3.8/bin/phpize ./configure --args... make make install 

我得到以下错误:

 PHP_FE_END (undefined function) 

从日文博客和PHP SVN源代码(请参阅下面的链接)

http://d.hatena.ne.jp/SeaHacker/20110825

http://marc.info/?l=php-cvs&m=131161504128077

显然,黑客是用{NULL,NULL,NULL}replacePHP_FE_FUNCTION {NULL,NULL,NULL}所以我在我的代码中添加了这个:

 sed -i 's|PHP_FE_END|{NULL,NULL,NULL}|' /opt/php/5.3.8/ext/**/*.c sed -i 's|ZEND_MOD_END|{NULL,NULL,NULL}|' /opt/php/5.3.8/ext/**/*.c 

这就解决了这个错误。 但是我不是一个C专家,所以我知道它的工作原理,但我不知道为什么这样有点令人沮丧。 任何人都可以在这个问题上的一些光?

PHP_FE_FUNCTIONmacros应该用“$ PREFIX / include / php / main / php.h”中的值{NULL,NULL,NULL}来定义(对于你,$ PREFIX可能是/ opt)。 应该将ZEND_MOD_END定义为“Zend / zend_modules.h”中的{ NULL, NULL, NULL, 0 } 。 两者都是初始化器,用于在声明它时初始化variables的值。

出于某种原因,为PHP 5.3.8(也可能是其他版本)安装的这些头文件的副本有时会丢失这些macros,尽pipe它存在于源代码分发的头文件中。 用{NULL,NULL,NULL}replacemacros是PHP_FE_FUNCTION ,因为这就是PHP_FE_FUNCTION的值。 对于ZEND_MOD_END它的工作原理是,如果初始值设定项中的值比数组元素/结构体成员中的值less,则任何剩余的元素/成员都将被初始化为0(关于完整故事,请参见C99,第6.7.8-21节)。 例如:

 int ii[10] = {NULL,NULL,NULL}; // ii[3] through ii[9] are 0 struct { int *pa, *pb, *pc, d,e,f; } s = {NULL, NULL, NULL}; // sd, .e, .f are 0 

解决错误的另一个方法是replace已安装的文件,这也将修复构build其他扩展:

  1. 将已安装的main / php.h与源代码中的副本进行比较,并查找不兼容的更改。 只要源代码和安装版本是相同的,不应该有太多的改变(我观察到MS Windows系统上的php_win32_docref2_from_error声明)。
  2. 如果没有出现任何问题,请将源代码main / php.h复制到已安装的php.h中。

第二个replace(macrosZEND_MOD_END )只适用于一些扩展名,例如imap。 对于这些,您也可以重复Zend / zend_API.h(对于ZEND_FE_END )和Zend / zend_modules.h(对于ZEND_MOD_END )的替代修复。

也许“make script”在包含path中找不到php版本的main / php.h。 (你可能包含/opt/php/5.3.8/includes或其他)。

在大多数情况下,最好的方法是使用php安装的php-config,试试这个:

./configure –with-php-config = / opt / php / 5.3.8 / bin / php-config