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