2012-08-29 3 views
-1

저는 라스베리 파이의 SPI 확장을 만들고 있는데, 추가하려고하는 클래스 함수에 다소 이상한 문제가 있습니다.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에서

: (php_spi on Github 당신은 내가 놓친 게 분명 아무것도 확인하려는 경우의 repo는 여기) 현재 일하고 있습니다.

/* {{{ 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 } 
}; 

코드는 정상적으로 컴파일을 내 spi.c 파일에서 나는 다음과 같은 함수가 정의되어 오류나 경고는 없지만 함수를 테스트하려고하면 함수가 정의되지 않았다는 PHP 오류가 발생합니다. 내가 뭘 놓칠 수 있니? 나이가 1 년 이상이다 질문에 downvote 주셔서 감사합니다 :

EDIT (그냥 명확하게하기 위해, 이것은이 하나 개의 기능을 제외하고 작동하는 확장 기능입니다).

+0

내가 과거에 해왔 던 바보 같은 일 중 하나는 ZEND_GET_MODULE() 문에서 상수를 정의하는 것을 잊는 것이다. – cleong

+0

나는 그것이 확실히있다 - 나의 연장의 다른 모든 부분은 예상대로 작동한다. – frak

+0

어쩌면 그것은 바보 같지만 컴파일러를 사용하여 spi.c를 컴파일하면됩니까? 이것이 g ++ 인 경우 내 보낸 함수에 유형 정보를 추가 할 수 있습니다. 또는 gcc를 사용합니까 (unix/linux를 사용하는 경우 ...) – Grzegorz

답변

0

글쎄, 내 테스트 파일에 오타에 시간 낭비에 대한 놀라운했다 : 그것은 함수 blockTransfer() 것에 대해 정의하지이었다로 (

O를 좀 더주의 깊게 읽기 오류해야 방법

내가 가진 테스트 파일에서 :.!.

$read = $spi-blockTransfer(); 

도현

시간을 낭비 죄송합니다

+0

/facepalm;) 오, 잘 알 수 있습니다. 다음 번에는, 맞지? –

0

PHP가 모듈을 찾는 경우 - 명령 행에서 php -m을 실행하거나 웹 페이지에서 phpinfo()을 호출하십시오. - 모듈이 나열되어 있습니까?

그렇지 않은 경우 How to enable php extension using `phpize`?을 확인하십시오. 또한 사용자 환경은 어떻습니까?

+0

PHP는 Spi 클래스가 인스턴스화되면서 모듈을 찾고 있으며, 내가 정의한 다른 모든 메소드를 실행할 수있다. , 일하고 싶지 않은 것은이 기능 중 하나입니다. 제 환경은 Raspbian입니다 (ARM 용으로 컴파일 된 Debian Wheezy 기반). Raspberry Pi를 실행합니다 – frak

+0

@frak 이것을 해결 했습니까? 방금 Git repo를 체크 아웃했는데 blockTransfer 메소드는 언급되지 않았습니다. 하지만 질문에 코드를 복사하면 잘 작동합니다 ... –

+0

마스터가 체크 아웃 한 경우 코드가 표시되지 않으며 블록 전송 브랜치를 체크하면 코드가 표시됩니다. 이상하게도 그것이 당신을 위해 일하는 것 같습니다 : S – frak

0

배열 Spi_methods을 정의했지만 사용자가 참조하지 않았습니다. 모듈 구조에서 참조되어야합니다. 예를 들어 this example을 참조하십시오.

다른 확장 장치에서 기호를 참조 할 필요가없는 한 함수 또는 arginfo 프로토 타입을 기본 확장 헤더 (또는 다른 머리글)에 넣지 않아도됩니다. 예를 들어 함수를 하나의 함수로 정의한 경우 파일을 만들지 만 다른 곳에 함수 입력 배열을 작성하십시오). 실제로 정적 인 빌드에 자동으로 포함되어 있다고 생각합니다. 이름 충돌을 피하기 위해선 안됩니다.

+0

나는 이미이 방법을 사용하고 있는데, 다른 방법은 모두 없으면 어떻게 될까요? 프로토 타입 정의는 PECL_CodeGen에서 나왔으므로 컨벤션을 계속 진행할 수있을 것이라고 생각했고, 다른 어떤 방법으로도 문제가되지 않습니다. – frak

관련 문제