windows下用c/c++开发php扩展 - Go语言中文社区

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:vs2008VCbin”,再次执行,有可能依旧会报错,图我找不到了。。大概意思就是the c++ compiler is vc9.0(vs2008) at least 所以尽量使用vs2008以上的compiler

继续执行:
这里写图片描述

这个文件可以在Microsoft Visual Studio 10.0Common7IDE目录下找到,复制到VCbin目录下即可。继续执行语句,成功。在D:php源码main目录下生成config.win32.h文件。

打开config.win32.h:找到里面
这里写图片描述

如果你用vc10进行编译,则需修改为
这里写图片描述

终于解决问题了,编译。。如果成功,生成dll,
但是我还是遇见了编译问题,fatal error c1902:程序数据库管理器不匹配。。
真是苦了,通过百度,在CSDN论坛上发现同样的问题,最后是这样解决的。
mspdbsrv.exe 或 mspdbcore.dll 丢失或者其版本和 mspdb80.dll 的版本不同,确定这三个文件的相同版本安装在系统里。
在VC安装目录下的Common7IDE 目录下拷贝这三个文件到 安装目录下的VCbin下即可
所有问题解决,我也成功编译出了php_hello.dll

6:最后,我们将其拷贝到二进制php目录下的ext目录,打开php.ini,添加上 extension=php_hello.dll
重启apache,测试自己的函数。

PS:当时我测试的函数是cock()

这里写图片描述

输出结果:
这里写图片描述

到此结束。。。搞这个东西真是快疯了,还好耐心的解决问题多次尝试,最终成功。我将自己所遇到的问题都贴了出来方便大家参考。php扩展这东西挺好玩的,我们可以开发自己的php函数。不过前提是c/c++要学的很好。。。总之慢慢来吧,祝大家早日成功~

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u013927110/article/details/44020675
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 18:13:06
  • 阅读 ( 825 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢