Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP扩展:已定义函数未定义_Php_C_Php Extension - Fatal编程技术网

PHP扩展:已定义函数未定义

PHP扩展:已定义函数未定义,php,c,php-extension,Php,C,Php Extension,我正在为我的Raspberry Pi创建一个SPI扩展,在我试图添加的类函数中遇到了一个相当奇怪的问题。(如果你想检查我遗漏的任何明显信息,回购协议就在这里:) 在我的php_spi.h中,我定义了: PHP_METHOD(Spi, blockTransfer); #if (PHP_MAJOR_VERSION >= 5) ZEND_BEGIN_ARG_INFO_EX(Spi__blockTransfer_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE,

我正在为我的Raspberry Pi创建一个SPI扩展,在我试图添加的类函数中遇到了一个相当奇怪的问题。(如果你想检查我遗漏的任何明显信息,回购协议就在这里:)

在我的php_spi.h中,我定义了:

PHP_METHOD(Spi, blockTransfer);
#if (PHP_MAJOR_VERSION >= 5)
ZEND_BEGIN_ARG_INFO_EX(Spi__blockTransfer_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
#if (PHP_MINOR_VERSION > 0)
  ZEND_ARG_ARRAY_INFO(0, data, 1)
#else
  ZEND_ARG_INFO(0, data)
#endif
  ZEND_ARG_INFO(0, colDelay)
  ZEND_ARG_INFO(0, discard)
ZEND_END_ARG_INFO()
#else /* PHP 4.x */
#define Spi__blockTransfer_args NULL
#endif
这是与其他一些方法一起使用的,这些方法的定义与目前的工作类似。在我的spi.c文件中,我定义了如下函数:

    /* {{{ proto array blockTransfer(array data[, int colDelay[, bool discard]])
   */
PHP_METHOD(Spi, blockTransfer)
{
    zend_class_entry * _this_ce;

    zval * _this_zval = NULL;
    zval * data = NULL;
    HashTable * data_hash = NULL;
    long colDelay = 1;
    zend_bool discard = 0;

    if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "a|lb", &_this_zval, Spi_ce_ptr, &data, &colDelay, &discard) == FAILURE) {
        return;
    }

    _this_ce = Z_OBJCE_P(_this_zval);

    // some code
}
/* }}} blockTransfer */
我已确保我的函数在函数列表中有一个条目:

static zend_function_entry Spi_methods[] = {
    PHP_ME(Spi, __construct, Spi____construct_args, /**/ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
    PHP_ME(Spi, __destruct, Spi____destruct_args, /**/ZEND_ACC_PUBLIC | ZEND_ACC_DTOR)
    PHP_ME(Spi, transfer, Spi__transfer_args, /**/ZEND_ACC_PUBLIC)
    PHP_ME(Spi, blockTransfer, Spi__blockTransfer_args, /**/ZEND_ACC_PUBLIC)
    PHP_ME(Spi, getInfo, Spi__getInfo_args, /**/ZEND_ACC_PUBLIC)
    PHP_ME(Spi, setupTimer, Spi__setupTimer_args, /**/ZEND_ACC_PUBLIC)
    PHP_ME(Spi, usecDelay, Spi__usecDelay_args, /**/ZEND_ACC_PUBLIC)
    { NULL, NULL, NULL }
};
代码编译得很干净,没有错误或警告,但是当我尝试测试函数时,我得到一个PHP错误,表示函数没有定义。我可能会错过什么

(需要明确的是,除了这一个函数之外,这是一个工作扩展)


编辑:感谢您对一个超过一年的问题投了否决票。

首先要检查的是PHP是否找到了模块-尝试在命令行上运行
PHP-m
,或者在网页中调用
phpinfo()
,是否列出了您的模块


如果没有,请同时查看,您的环境是什么?

您定义了数组
Spi\u方法,但没有引用它。必须在模块结构中引用;例如,见


您不需要将函数或arginfo原型放入主扩展标题(或任何其他标题,除非您需要引用其他编译单元中的符号,例如,如果您在一个文件中定义了函数,但在另一个文件中构建了函数条目数组)。事实上,我认为它是自动包含在静态构建中的,所以为了避免名称冲突,您不应该这样做。

好吧,在我的测试文件中输入错误浪费了大量时间:o(

我应该更仔细地阅读错误,因为它是关于函数blockTransfer()未定义的,而不是方法

在测试文件中,我有:

$read = $spi-blockTransfer();


很抱歉浪费您的时间。

我过去做过一件愚蠢的事,就是忘记定义ZEND_GET_模块()周围的常数语句。我可以肯定这一点-我的扩展的所有其他部分都按预期工作。也许这很愚蠢,但您使用什么编译器来编译spi.c?如果这是g++它可能会向导出的函数添加类型信息。或者您使用gcc(如果您使用unix/linux…)@Grzegorz但为什么它只对一个函数执行此操作?我的类load just finePHP中的其余方法在Spi类实例化时查找模块,我可以运行我定义的所有其他方法,只是这一个函数不想工作。我的环境是Raspbian(基于Debian哮喘病,为ARM编写),在树莓上奔跑Pi@frak你解决了这个问题吗?我刚刚检查了你的Git回购协议,没有提到blockTransfer方法。但是如果我复制了问题中的代码,它可以正常工作……如果你有master签出,你将看不到代码,如果你尝试检查block sending分支,你应该会看到代码。奇怪的是,它似乎是w我已经有了这个,如果没有它,其他所有的方法怎么能工作呢?原型定义来自PECL_CodeGen,所以我想我还是继续这个惯例吧,它不会给我的其他方法带来任何问题,我的工作很好