C++实现PHP扩展
使用Ubuntu12.04开发环境 一、修改config文件 config.m4文件是编译基础中最核心的文件,这个文件主要用于autoconfi来产生configure配置文件,继而自动生成Makefile文件。 1. 生成扩展模块框架 #./ext_skel --extname=ext_name 2. 修改config.m4文件 这里有几
使用Ubuntu12.04开发环境
一、修改config文件
config.m4文件是编译基础中最核心的文件,这个文件主要用于autoconfi来产生configure配置文件,继而自动生成Makefile文件。
1. 生成扩展模块框架
#./ext_skel --extname=ext_name
2. 修改config.m4文件
这里有几个重要的宏命令如下:
dnl 是注释;
PHP_ARG_WITH或者PHP_ARG_ENABLE指定了PHP扩展模块的工作方式,前者意味着不需要第三方库,后者正好相反;
PHP_REQUIRE_CXX 用于指定这个扩展用到了C++;
PHP_ADD_INCLUDE 指定PHP扩展模块用到的头文件目录;
PHP_CHECK_LIBRARY 指定PHP扩展模块PHP_ADD_LIBRARY_WITH_PAH定义以及库连接错误信息等;
PHP_ADD_LIBRARY(stdc++, "", EXTERN_NAME_LIBADD) 用于标准C++库链接进入扩展;
PHP_SUBST(EXTERN_NAME_SHARED_LIBADD) 用于说明这个扩展编译成动态库的形式;
PHP_NEW_EXTENSION 用于指定哪些源文件应该被编译,文件与文件之间用空格隔开;
ext_skel 默认生成的模块框架是针对C的,我们要使用C++进行PHP扩展。那除以上的PHP_REQUIRE_CXX, PHP_ADD_LIBRARY两个宏
必需外,还要把ext_name.c改名为ext_name.cpp
修改类似
PHP_REQUIRE_CXX() INCLUDES=”$INCLUDES `mysql_config –cflags`” PHP_ADD_LIBRARY(stdc++, “”, EXTRA_LDFLAGS) EXTRA_LDFLAGS=”$EXTRA_LDFLAGS `mysql_config –libs` -lmemcached” AC_CHECK_HEADERS([mysql/mysql.h]) CPPFILE=”ext_name.cpp antiForbitWord.cpp antiBaseDict.cpp Trie.cpp Logger.cpp antiEncodeConverter.cpp strnormalize.cpp” PHP_NEW_EXTENSION(ext_name, $CPPFILE, $ext_shared)
二、修改.h文件
这里指修改php_ext_name.h这个文件。
由于TSRM.h这个文件所包含的函数和类都是用纯C语言写的,故应该使用extern来说明如下:
extern “C” { #ifdef ZTS #include “TSRM.h” #endif }
如果php_ext_name.h文件或ext_name.cpp文件用到了C++中的一些容器或函数,则需要在头文件中包含相应的头文件。
三、修改.cpp文件
这里指修改ext_name.cpp这个文件
由于config.h、php.h、php.ini和ext/standard/info.h中包含的函数和类如TSRM.h一样,都是用纯C语言写的,所以都要用extern说明。
extern “C” { #ifdef HAVE_CONFIG_H #include “config.h” #endif #include “php.h” #include “php_ini.h” #include “ext/standard/info.h” }
#ifdef COMPILE_DL_EXT_NAME BEGIN_EXTERN_C() ZEND_GET_MODULE(ext_name) END_EXTERN_C() #endif
四、编译安装扩展库
#phpize
#./configure
#make
#make install
参考文章:http://www.blogjava.net/xiaomage234/archive/2009/08/31/293353.html
上一篇: 在Java里面如何解决进退两难的jar包冲突问题?
下一篇: 如何轻松理解二叉树的深度遍历策略