PHP 모듈 작성 시 다음과 같은 오류 메세지가 나오는 경우가 있다.
error: 'PHP_FE_END' undeclared here (not in a function)
1.
내 상황은 서버가 centos6.3 으로 php 는 rpm으로 설치되어있다.
php-devel 패키지도 설치해놨지만 ext_skel 은 없었고 구글링하다보니 src.rpm 을 던져주는 링크만 나오더라.
https://www.centos.org/forums/viewtopic.php?t=28478
2.
굳이 src.rpm으로 작업하고 싶은 생각은 없어 그냥 php-5.3.3 의 소스를 찾았지만 나오질 않는다.
그냥 php-5.3.28 을 받아 타르볼을 풀고
ext로 들어가 알려진대로
./ext_skel --extname=test_mod
cd test_mod
vi config.m4
10라인, PHP_ARG_WITH(test_mod, for test_mod support,
12라인, [ --with-test_mod Include test_mod support])
에서 dnl 주석 해제
phpize
./configure
make
3.
뭐 이런 수순으로 스켈레톤을 빌드 해보는데 정의되지 않았다고 오류가 발생한다.
libtool: compile: cc -I. -I/ ~~~~ :43: error: 'PHP_FE_END' undeclared here (not in a function)
make: *** [test_mod.lo] Error 1
4.
구글링해보니 PHP_FE_END는 php-5.3.10 부터 등장했단다. https://github.com/sqmk/pecl-jsmin/issues/23
이하버전에 호환되는 모듈을 뒤져보니
{NULL, NULL, NULL}
다행히도 PHP_FE_END 대신 쓰이는 놈이 있다.
덜 게으르면 버전 확인해서 #if 하겠지만 한두개 뒤져봤을 때 PHP 버전 정의가 잘 안뵌다.
여러버전에서 자주 컴파일 할일이 있을 때 까진 그냥 이리 써야겠다.
test_mod.c :
const zend_function_entry test_mod_functions[] = {
PHP_FE(confirm_test_mod_compiled, NULL) /* For testing, remove later. */
//PHP_FE_END /* Must be the last line in test_mod_functions[] */ // PHP 5.3.10 ~
{NULL, NULL, NULL} /* Must be the last line in test_mod_functions[] */ // PHP 5.3.10 under
};