windows下用c/c++开发php扩展
cygwin ,它是一个在windows平台上运行的类unix模拟环境
php源码(压缩包)
php二进制文件,也就是安装在windows上的php
vs2008 或者更高(vs2010,vs2013)
win32build.rar和bindlib_win32.rar(主要用来生成config.win32.h)
二:配置过程
1: 解压PHP源码,里面有一个ext目录,这里便是负责开发PHP扩展的目录,目录中有默认的所有扩展源码,还有两个文件,
ext_skel_win32.php 和 ext_skel文件
ext_skel是创建扩展的shell,在windows上无法运行,所以必须要有cygwin模拟unix环境
2:解压完之后,我们需要在ext目录中生成我们自己的扩展目录.
我们直接win+r cmd 进入命令行,然后cd 跳转到ext目录,输入以下指令:
php ext_skel_win32.php –extname=myext 或者
php.exe ext_skel_win32.php –extname=myext
这里很容易出现错误
首先:php和php.exe指的是安装在windows上的php,它的根目录里面有php.exe,目的是用来解析php文件,所以我们需要将安装的php目录设置到环境变量中。
其次:如果没有安装cygwin或者没有设置cygwin,就会出现以下错误。所以 ,我们需要安装cygwin,然后打开php源码ext目录中的ext_skel_win32.php ,里面有一个变量叫$cygwin_path = “c:/cygwin/bin”; 将它修改为你安装的目录并保存,try again
如果依旧报错,请看这张图,你是否犯错了。
一切完成之后 如果出现以下情况,则表明创建扩展目录(骨架)成功,
里面包含的目录大概是这个样子,其中我们需要修改的两个文件是(如箭头所示)
3:添加依赖的php5ts.lib
将php二进制包中的dev目录下的php5ts.lib拷贝到你的扩展目录中
4:(1)修改php_hello.h文件
扩展新的函数:在PHP_FUNCTION(confirm_myhello_compiled);行后添加一行 PHP_FUNCTION(hello);
(2)修改hello.c 文件
在数组zend_function_entry myhello_functions[]增加一行
1. zend_function_entry myhello_functions[] = {
2. PHP_FE(confirm_myhello_compiled, NULL) /* For testing, remove later. */
3. PHP_FE(hello, NULL) // 新增的行
4. {NULL, NULL, NULL} /* Must be the last line in myhello_functions[] */
5. };
在PHP_FUNCTION(confirm_myhello_compiled) 后添加我们的新函数
1. PHP_FUNCTION(hello){
2. php_printf(”Hello C extension”);
3. }
4.
5:构建dll扩展文件
接下来就是编译扩展文件了,用vs2008打开hello.dsp,选择编译方式为Release_TS,然后开始编译,或者在通过命令行进入ext/hello 执行 msdev hello.dsp /MAKE “hello - Win32 Release_TS” 如果成功,则会在ext同级目录Release_TS中生成php_hello.dll。
到这里基本主要任务基本完成了,但是这里也是最容易出错误的。
最常见的错误 ,编译时它会出现Cannot open include file “../main/config.win32.h” 结果到main文件夹根本就没这个文件。
所以,将win32build.rar和bindlib_win32.rar都解压到php源码中win32/build目录下,并将win32/build添加到环境变量
进入cmd 跳转到php源码目录,输入
cscript /nologo configure.js –with-php-build=”../win32build” –without-libxml –disable-odbc 回车后有可能出现
意思是没有找打cl.exe,所以我们需要将安装好的vs2008目录中的的bin目录添加到环境变量,我的机器上是”D:\vs2008\VC\bin”,再次执行,有可能依旧会报错,图我找不到了。。大概意思就是the c++ compiler is vc9.0(vs2008) at least 所以尽量使用vs2008以上的compiler
继续执行:
这个文件可以在Microsoft Visual Studio 10.0\Common7\IDE目录下找到,复制到VC\bin目录下即可。继续执行语句,成功。在D:\php源码\main目录下生成config.win32.h文件。
打开config.win32.h:找到里面
如果你用vc10进行编译,则需修改为
终于解决问题了,编译。。如果成功,生成dll,
但是我还是遇见了编译问题,fatal error c1902:程序数据库管理器不匹配。。
真是苦了,通过百度,在CSDN论坛上发现同样的问题,最后是这样解决的。
mspdbsrv.exe 或 mspdbcore.dll 丢失或者其版本和 mspdb80.dll 的版本不同,确定这三个文件的相同版本安装在系统里。
在VC安装目录下的\Common7\IDE 目录下拷贝这三个文件到 安装目录下的VC\bin下即可
所有问题解决,我也成功编译出了php_hello.dll
6:最后,我们将其拷贝到二进制php目录下的ext目录,打开php.ini,添加上 extension=php_hello.dll
重启apache,测试自己的函数。
PS:当时我测试的函数是cock()
输出结果:
到此结束。。。搞这个东西真是快疯了,还好耐心的解决问题多次尝试,最终成功。我将自己所遇到的问题都贴了出来方便大家参考。php扩展这东西挺好玩的,我们可以开发自己的php函数。不过前提是c/c++要学的很好。。。总之慢慢来吧,祝大家早日成功~
以上就介绍了windows下用c/c++开发php扩展,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。