内容均以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.

Link: http://www.cnblogs.com/farwish/p/5696878.html

[php-src]Php扩展的多文件编译的更多相关文章

  1. php重新编译,gd扩展支持jpeg文件

    晚上写东西的时候,报了一个错误: Call to undefined function imagecreatefromjpeg() 没有开启 jpeg 支持?原来是默认安装的 gd 扩展默认不支持 j ...

  2. Makefile 描述的是文件编译的相关规则,它的规则主要是两个部分组成,分别是依赖的关系和执行的命令 PHONY伪目标实践

    Makefile的工作流程 http://c.biancheng.net/view/7091.html Makefile文件是什么? 我们教程主要是讲的是 Makefile .很多 Linux(Uni ...

  3. PHP扩展-如何使用文件config.m4

    config.m4文件用于指定正在开发的扩展在类unix系统下构建时支持的选项,指定此扩展需要哪些库以及哪些源文件:使用 GNU autoconf 语法编写.注意需要重新执行phpize,config ...

  4. PHP扩展-扩展的生成和编译

    首先说明一下,PHP扩展有两种编译方式:方式一:在编译PHP时直接将扩展编译进去方式二:扩展被编译成.so文件,在php.ini里配置加载路径: 以下开始说明创建PHP扩展并编译的步骤:下载PHP源码 ...

  5. [转]嵌入式SQC文件编译

      Src Url:http://blog.csdn.net/cws1214/article/details/12996351   A.预编译部分  1.预编译DB2篇 1.1 什么是DB2预编译 在 ...

  6. JAVA 文件编译执行与虚拟机(JVM)简单介绍

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo3 java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 ...

  7. C# 选择文件、选择文件夹、打开文件(或者文件夹) 路径中获取文件全路径、目录、扩展名、文件名称 追加、拷贝、删除、移动文件、创建目录 修改文件名、文件夹名!!

    https://www.cnblogs.com/zhlziliaoku/p/5241097.html 1.选择文件用OpenDialog OpenFileDialog dialog = new Ope ...

  8. C语言include预处理命令与多文件编译

    #include预处理命令几乎使我们在第一次接触C的时候就会碰到的预处理命令,可我现在还不怎么清楚,这次争取一次搞懂. 一.#include预处理指令的基本使用 预处理指令可以将别处的源代码内容插入到 ...

  9. 用gulp把less文件编译成css文件

    第一次使用gulp构建工具,使用gulp将.less文件编译成.css文件并输出.根据视频做了笔记.提供新手和自己以后做参考. HTML文件 <!DOCTYPE html> <htm ...

随机推荐

  1. kaggle& titanic代码

    这两天报名参加了阿里天池的’公交线路客流预测‘赛,就顺便先把以前看的kaggle的titanic的训练赛代码在熟悉下数据的一些处理.题目根据titanic乘客的信息来预测乘客的生还情况.给了titan ...

  2. NPM 相关

    1. 官方网站 https://docs.npmjs.com/ 2. 显示Global Module安装过什么 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font ...

  3. java8中map的meger方法的使用

    java8中map有一个merge方法使用示例: /** * 打印出包含号码集的label的集合 * * @param args */ public static void main(String[] ...

  4. Spring-Batch CSV文件读取时的注意点

    按照Spring Batch 之 Sample(CSV文件操作)(四) 的方式配置好csvItemReader, 发现读入的数据很是奇怪,通过修改配置文件发现, commit-interval=&qu ...

  5. Managing IIS Log File Storage

    Managing IIS Log File Storage   You can manage the amount of server disk space that Internet Informa ...

  6. 获取B表数据添加到A表中作为一个下拉列表元素存在

    1.ProductController类里toedit方法内添加: ProductModel product = ProductModel.dao.findById(id); //通过id查找服务类 ...

  7. unity3d 孤岛求生基础案例

    第二个案例,此案例主要实现了第一人称控制器,把移动从世界坐标系转化到人物平面坐标系,通过碰撞器,触发器,光线透射触发器实现交互.实现UI texture记录收集信息,ui texture是更新内容对应 ...

  8. 嵌套移动APP端的H5页面meta标签

    <meta charset="utf-8"> <meta content="width=device-width, initial-scale=1.0, ...

  9. centos 6.5 msyql5.6安装

    MySQL 安装 安装mysql前需要查询系统中含有的有关mysql的软件. rpm -qa | grep -i mysql   如下 代表有mysql ,则先进行卸载 mysql-libs-5.1. ...

  10. Linux进程间通信之消息队列

    本文依据以下思路展开,首先从宏观上阐述消息队列的机制,然后以具体代码为例进一步阐述该机制,最后试着畅想一下该通信机制潜在的应用. 消息队列是在两个不相关进程间传递数据的一种简单.高效方式,她独立于发送 ...