[php-src] Php扩展的多文件编译
内容均以php5.6.14为例.
假设有模块 foo,php_foo.h 和 foo.c 是固有文件,额外的C文件如果要加入编译,大致有五步。
1. 新增头文件 foo_bar.h
#ifndef FOO_BAR_H #define FOO_BAR_H extern zend_class_entry *foo_bar_ce; #endif
2. 新增主文件 foo_bar.c,里面的两个头文件要加.
#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_foo.h" // #1. #include "foo_bar.h" // #2. zend_class_entry *foo_bar_ce; zend_function_entry foo_bar_methods[] = { {NULL, NULL, NULL} }; FOO_STARTUP_FUNCTION(bar) { zend_class_entry ce; /* init class entry */ INIT_CLASS_ENTRY(ce, "Foo_Bar", foo_bar_methods); /* register */ foo_bar_ce = zend_register_internal_class(&ce TSRMLS_CC); /* flags */ return SUCCESS; }
3. 头文件 php_foo.h 新定义宏
#define FOO_STARTUP_FUNCTION(module) ZEND_MINIT_FUNCTION(foo_##module) #define FOO_STARTUP(module) ZEND_MODULE_STARTUP_N(foo_##module)(INIT_FUNC_ARGS_PASSTHRU) #define FOO_SHUTDOWN_FUNCTION(module) ZEND_MSHUTDOWN_FUNCTION(foo_##module) #define FOO_SHUTDOWN(module) ZEND_MODULE_SHUTDOWN_N(foo_##module)(SHUTDOWN_FUNC_ARGS_PASSTHRU)
4. 主文件 foo.c 中引入新增的头文件,并在 MINIT 阶段启动新增模块
#include "php_foo.h" #include "foo_bar.h" // #1.
/* startup component */ FOO_STARTUP(conf); // #2.
5. config.m4 增加新的C文件
PHP_NEW_EXTENSION(foo,
foo.c \
foo_bar.c \
, $ext_shared)
这最后要注意的也是最重要的,由于更改了m4文件,须重新执行从 phpize 开始的安装步骤使之生效。
不然你将得到一个错误 php: symbol lookup error.
Refer:PHP扩展多文件编译