五月 4th, 2009php扩展之c到c++简记
此文章来源于后羿之弓,转载请注明出处
1.理解config.m4
1).dnl是注释
2).PHP_ARG_WITH或者PHP_ARG_ENABLE指定了PHP模块的工作方式,任选一种
3).PHP_REQUIRE_CXX()用于指定这个扩展用到了C++
4).PHP_SUBST(SYSFILE_SHARED_LIBADD)用于说明这个扩展编译成动态链接库的形式
5).PHP_ADD_LIBRARY(stdc++,”",SYSFILE_SHARED_LIBADD)用于将标准C++库链接进入扩展
6).PHP_NEW_EXTENSION用于指定有哪些源文件应该被编译,文件和文件之间用空格隔开.
2.c转变成c++
ext_skel默认生成的模块框架是针对C的,我们要使用C++,那以上的3,5两个宏就是必须的.另外还要把(扩展名.c)改名成(扩展名.cpp),所以PHP_NEW_EXTENSION原本包括的(扩展名.c)也要修改.
在使用C++之后要注意一个小问题,那就是php_(扩展名).h这个文件可能被PHP的其他部分所引用到,而引用者很可能是一个.c文件,所以不能在php_(扩展名).h里包含任何C++所独有的东西.比如标准模版库,类,或者bool类型等等.
3.后续工作
默认生成的(扩展名).c(现在改名为(扩展名).cpp)了,因为是C++了,有几点是要修改的: (zend_function_entry是导出函数列表, zend_module_entry描述了模块的信息.)
1).#include “php.h” #include “php_ini.h” #include “ext/standard/info.h” 要用extern “C” 修饰.
2).ZEND_GET_MODULE也要用extern “C”修饰
3).zend_module_entry就是用于描述模块信息的类型,其实就是一个结构,其中第二项不知道是什么含意.在Windows上,这好像是一个描述信息,可以是一个长长的字符串,但是在Linux上似乎只能是跟模块名相同.
4.调试
1).gdb ,file ./sapi/cli/php
2).用b命令下断点.因为是C++程序,所以扩展的导出函数名并不是我们输入的名字,可以用nm命令查看扩展的所有导出函数,找到编译器最终分配的名字.这个名字是肯定包含了你原本输入的名字的,所以很好找.
gdb会提示说这个符号在当前程序(php)里找不到,问你要不要在以后的shared library里找,回答Yes
3). run test.php,之后就会停在断点上了. 用n,s,display之类的命令调试的.