您的位置:

php调用静态库(php 静态编译)

本文目录一览:

如何在php扩展中封装一个c++类

首先,要到了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++了,还是有几点要修改的,否则跑不起来:

php中怎么调用方法中的静态变量?

static

变量是php中的变量作用范围的一个重要特性

静态变量仅在局部函数域中存在且只被初始化一次,当程序执行离开此作用域时,其值不会消失,会使用上次执行的结果

一个普通的变量,如

$message

在它所在的函数执行完之后就被释放了

即第二个function执行10次,每次执行完后,$message变量被释放,所以每次都是1

变量前加了static后,该变量在它所在的函数执行完后不会被释放

即第一个function每次被执行后,static

$message没有被释放,它将被继续累加

PHP两个次调用静态变量的疑问

是否为先请求A.php然后再请求B.php,这样的话在B页面会一直是空值

应该在一次请求中先set再get,这样得到的值就是设置后后的新值