2012-08-29 65 views
-1

我正在爲我的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。

+0

我過去做過的一件愚蠢的事是忘記在ZEND_GET_MODULE()語句周圍定義常量。 – cleong

+0

我肯定 - 我的擴展的所有其他部分按預期工作。 – frak

+0

也許這很愚蠢,但是你用什麼編譯器來編譯你的spi.c?如果這是g ++,它可能會將類型信息添加到導出的函數中。或者你使用gcc(如果你使用unix/linux ...) – Grzegorz

回答

0

嗯,這是一個驚人的關於在我的測試文件中浪費一個錯字時間:O(

我應該更仔細地閱讀錯誤,因爲它是關於函數blockTransfer()是不確定的,而不是方法

在測試文件我有:!

$read = $spi-blockTransfer(); 

衛生署

對不起,浪費你的時間

+0

/facepalm;)哦,你會知道下一次,對嗎? –

0

首先要檢查的是如果PHP找到模塊 - 嘗試在命令行上運行php -m或在網頁中調用phpinfo() - 您的模塊是否已列出?

如果不是,請查看How to enable php extension using `phpize`?另外,您的環境是什麼?

+0

PHP正在找到模塊,因爲Spi類實例化,我可以運行我已定義的所有其他方法,這只是這一個不想工作的功能。我的環境是Raspbian(基於Debian Wheezy,爲ARM編譯),在Raspberry Pi上運行 – frak

+0

@frak你解決了這個問題嗎?我剛剛檢出了你的Git倉庫,並沒有提到blockTransfer方法。但如果我在問題中的代碼複製,它工作正常... –

+0

如果你有主人簽出你不會看到代碼,如果你嘗試檢查塊發送分支,你應該看到的代碼。奇怪的是,它似乎爲你工作,雖然:S – frak

0

您定義了數組Spi_methods,但沒有引用它。它必須在模塊結構中引用;例如參見this example

您不需要將函數或arginfo原型放在主擴展頭(或任何其他頭文件中,除非需要引用其他編譯單元中的符號,例如,如果您在一個函數中定義了函數文件,但在另一箇中構建函數入口數組)。事實上,我認爲它會自動包含在靜態構建中,因此您不應該爲了避免名稱衝突。

+0

我已經有了這個,如果沒有它,其他所有的方法會如何工作?原型定義來自PECL_CodeGen,所以我認爲我可能會繼續約定,並且它不會導致任何其他方法的任何問題,我已經工作得很好 – frak