我正在爲我的Raspberry Pi創建一個SPI擴展,並且遇到了一個我嘗試添加的類函數的一個相當奇怪的問題。 (回購在這裏,如果你想查詢什麼明顯的我失蹤:php_spi on Github):PHP擴展:定義的函數未定義
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
這是隨着一些其他的方法,同樣定義了
在我php_spi.h我已經定義目前工作。在我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錯誤,說該函數沒有定義。我可能會錯過什麼?
(只是要清楚,這是除了這一個功能的工作擴展)
編輯:感謝您對一個問題是超過一年downvote。
我過去做過的一件愚蠢的事是忘記在ZEND_GET_MODULE()語句周圍定義常量。 – cleong
我肯定 - 我的擴展的所有其他部分按預期工作。 – frak
也許這很愚蠢,但是你用什麼編譯器來編譯你的spi.c?如果這是g ++,它可能會將類型信息添加到導出的函數中。或者你使用gcc(如果你使用unix/linux ...) – Grzegorz