如何在php扩展中封装一个c++类
1个回答
推荐于2016-10-04
展开全部
首先,要到了Query归一化的C++版本源代码。
query归一化
引用第三方的类库有两种方法,一种是静态引用,一种是动态引用,推荐使用静态引用,因为静态引用的情况下,会把类库打包到php的扩展.SO文件中,这样我们不必担心依赖关系,带着类库到处跑了。
先用gcc产生.o文件,再用.o产生 最终的静态库 .a 文件
gcc -c -fpic queryword.cpp tradmap.cpp transcode.cpp -I . -O2
ar -r libqueryword.a queryword.o tradmap.o transcode.o
上边图中有产生的.o 和 .a文件
如果要动态编译so的话,就是这个:
gcc -c -fpic -O3 queryword.cpp tradmap.cpp transcode.cpp -I .
gcc -shared queryword.o transcode.o tradmap.o -o libqueryword.so
好,现在有了libqueryword.a静态库,我们就可以开始做我们的扩展了。
先使用ext_skel工具生成我们框架的骨架.
./ext_skel –extname=queryword
把上边的静态库放到 ./lib 目录下。
然后修改config.m4文件。
去掉一些注释符 dnl, 再添加两行,最后config.m4里,有用的就是这几行。
PHP_ARG_ENABLE(queryword, whether to enable queryword support,
Make sure that the comment is aligned:
[ --enable-queryword Enable queryword support])
if test "$PHP_QUERYWORD" != "no"; then
PHP_ADD_INCLUDE(./lib)
PHP_ADD_LIBRARY(stdc++, 1, QUERYWORD_SHARED_LIBADD)
PHP_ADD_LIBRARY_WITH_PATH(queryword, ./lib, QUERYWORD_SHARED_LIBADD)
PHP_REQUIRE_CXX()
PHP_SUBST(QUERYWORD_SHARED_LIBADD)
PHP_NEW_EXTENSION(queryword, queryword.cpp, $ext_shared)
fi
其中:
PHP_REQUIRE_CXX()用于指定这个扩展用到了C++
PHP_ADD_LIBRARY(stdc++, 1, QUERYWORD_SHARED_LIBADD) 用于将标准C++库链接进入扩展
PHP_NEW_EXTENSION用于指定有哪些源文件应该被编译,文件和文件之间用空格隔开.ext_skel默认生成的模块框架是针对C的,我们要使用C++,那以上说明的两个宏就是必须的.另外还要把queryword.c改名成queryword.cpp,所以PHP_NEW_EXTENSION原本包括的queryword.c也要修改.
默认生成的queryword.c(现在改名为queryword.cpp)了,已经包含了一个测试性质的导出函数,通过那个例子就可以大概明白怎么添加自己的函数了. zend_function_entry是导出函数列表, zend_module_entry描述了模块的信息. 不过因为是C++了,还是有几点要修改的,否则跑不起来:
query归一化
引用第三方的类库有两种方法,一种是静态引用,一种是动态引用,推荐使用静态引用,因为静态引用的情况下,会把类库打包到php的扩展.SO文件中,这样我们不必担心依赖关系,带着类库到处跑了。
先用gcc产生.o文件,再用.o产生 最终的静态库 .a 文件
gcc -c -fpic queryword.cpp tradmap.cpp transcode.cpp -I . -O2
ar -r libqueryword.a queryword.o tradmap.o transcode.o
上边图中有产生的.o 和 .a文件
如果要动态编译so的话,就是这个:
gcc -c -fpic -O3 queryword.cpp tradmap.cpp transcode.cpp -I .
gcc -shared queryword.o transcode.o tradmap.o -o libqueryword.so
好,现在有了libqueryword.a静态库,我们就可以开始做我们的扩展了。
先使用ext_skel工具生成我们框架的骨架.
./ext_skel –extname=queryword
把上边的静态库放到 ./lib 目录下。
然后修改config.m4文件。
去掉一些注释符 dnl, 再添加两行,最后config.m4里,有用的就是这几行。
PHP_ARG_ENABLE(queryword, whether to enable queryword support,
Make sure that the comment is aligned:
[ --enable-queryword Enable queryword support])
if test "$PHP_QUERYWORD" != "no"; then
PHP_ADD_INCLUDE(./lib)
PHP_ADD_LIBRARY(stdc++, 1, QUERYWORD_SHARED_LIBADD)
PHP_ADD_LIBRARY_WITH_PATH(queryword, ./lib, QUERYWORD_SHARED_LIBADD)
PHP_REQUIRE_CXX()
PHP_SUBST(QUERYWORD_SHARED_LIBADD)
PHP_NEW_EXTENSION(queryword, queryword.cpp, $ext_shared)
fi
其中:
PHP_REQUIRE_CXX()用于指定这个扩展用到了C++
PHP_ADD_LIBRARY(stdc++, 1, QUERYWORD_SHARED_LIBADD) 用于将标准C++库链接进入扩展
PHP_NEW_EXTENSION用于指定有哪些源文件应该被编译,文件和文件之间用空格隔开.ext_skel默认生成的模块框架是针对C的,我们要使用C++,那以上说明的两个宏就是必须的.另外还要把queryword.c改名成queryword.cpp,所以PHP_NEW_EXTENSION原本包括的queryword.c也要修改.
默认生成的queryword.c(现在改名为queryword.cpp)了,已经包含了一个测试性质的导出函数,通过那个例子就可以大概明白怎么添加自己的函数了. zend_function_entry是导出函数列表, zend_module_entry描述了模块的信息. 不过因为是C++了,还是有几点要修改的,否则跑不起来:
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询