天天看點

php extname shared,C++實作PHP擴充

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