Heim  >  Artikel  >  Backend-Entwicklung  >  windows下用c/c++开发php扩展

windows下用c/c++开发php扩展

WBOY
WBOYOriginal
2016-08-08 09:29:041162Durchsuche

一:所需工具:

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[]增加一行

<code>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. };  
</code>

在PHP_FUNCTION(confirm_myhello_compiled) 后添加我们的新函数

<code>1. PHP_FUNCTION(hello){  
2.     php_printf(”Hello C extension”);  
3. }  
4. 
</code>

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教程有兴趣的朋友有所帮助。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:PHP缓存处理Nächster Artikel:常见基础算法笔记