Heim  >  Artikel  >  php教程  >  C++实现PHP扩展

C++实现PHP扩展

WBOY
WBOYOriginal
2016-06-06 19:42:201219Durchsuche

使用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”
}


另外ZEND_GET_MODULE这个宏命令也需要特别声明。
#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




Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn