PHP 第26章 windows下用c/c++开发php扩展 PHP 第26章 windows下用c/c++开发php扩展

2022-08-11

一、所需工具

ed2k://|file|cn_visual_studio_ultimate_2012_x86_dvd_920954.iso|1643802624|A3058CE4F2AD7035DB6E67586D07AAA5|/

可用百度云的离线下载进行下载
  • cygwin ,它是一个在windows平台上运行的类unix模拟环境,一直点击下一步进行安装

二、编译 PHP

①、首先将 php-sdk-binary-tools-20110915.zip,解压到 F:\php-sdk

解压后的目录如下:

https://file.lulublog.cn/images/3/2022/08/u4NQPR934PvvVziPQp4p003qMLr403.png

②、开一个 cmd 窗口,切换到 F:\php-sdk 目录下,运行vcvarsall.bat来设置好编译环境变量。

https://file.lulublog.cn/images/3/2022/08/Yub3yZ4KZKPk6lK6B4As3RSZgwS763.png

这里vcvarsall.bat的具体目录要根据你自己的安装位置而定。

③、接着,在cmd窗口里继续运行以下命令

bin\phpsdk_setvars.bat
bin\phpsdk_buildtree.bat php56dev

https://file.lulublog.cn/images/3/2022/08/X2hY2RAa1t1hAfAHsywfYHN1krQkNy.png

这样,在F:\php-sdk目录下又多了一个php56dev目录。

④、复制 F:\php-sdk\php56dev\vc9 到 F:\php-sdk\php56dev 并重命名为 vc11

https://file.lulublog.cn/images/3/2022/08/QO9sHJ81pH5GH1LsoRJrrzgevgRz81.png

⑤、将 deps 解压到 F:\php-sdk\php56dev\vc11\x86,覆盖原有的文件。

应该复制进很多必要的模块/扩展所需的库文件。

⑥、将 PHP-5.6.38 源码目录解压到F:\php-sdk\php56dev\vc11\x86

https://file.lulublog.cn/images/3/2022/08/z8tXU956q9596tq662t8mLjZzg26zj.png

⑦、进入php源码目录

cd php56dev\vc11\x86\php-5.6.38-src

运行:

buildconf

然后就可以先试着编译php了。最开始,一般编译尽可能少的模块,先让核心能正常编译出来:

configure --disable-all --enable-cli

这一步的主要目的是生成 F:\php-sdk\php56dev\vc11\x86\php-5.6.38-src\main\config.w32.h。

php默认是ts模式,使用nts需要加上下面参数

configure --disable-all --enable-cli --disable-zts

这里可能遇到的错误:

A、vc 没有加入环境变量

https://file.lulublog.cn/images/3/2022/08/J26BFnhdyno333eAYhrDfNFFlrsBgv.png

解决 —— 把 D:\SoftWare\VS2012\VC\bin 加入环境变量,具体目录要根据你自己的安装位置而定。

B、计算机中丢失 mspdb110.dll 

https://file.lulublog.cn/images/3/2022/08/GL2oX985Zzo85Zef8Hfrqr5txfIXez.png

解决 —— 复制 D:\SoftWare\VS2012\Common7\IDE\mspdb110.dll 到 D:\SoftWare\VS2012\VC\bin 下

三、创建新扩展 hello

①、ext_skel 和 ext_skel_win32.php

在 F:\php-sdk\php56dev\vc11\x86\php-5.6.38-src\ext 目录下有两个文件:ext_skel 和 ext_skel_win32.php。这两个文件分别是linux、windows下的扩展骨架搭建工具。

此次讲的是Windows中搭建PHP扩展开发环境,所以使用的是ext_skel_win32.php。用它生成的新扩展骨架,可以直接用VS打开。ext_skel是创建扩展的shell,在windows上无法运行,所以必须要有cygwin模拟unix环境。

②、切换到 ext 目录

cd F:\php-sdk\php56dev\vc11\x86\php-5.6.38-src\ext

③、生成 hello 扩展

php ext_skel_win32.php --extname=hello

生成的目录如下:

https://file.lulublog.cn/images/3/2022/08/ydImZ05025Q5md5iFvtM5TMLL2F5IM.png

这里很容易出现错误:

首先: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

https://file.lulublog.cn/images/3/2022/08/EXvcbXbc0BYqyYeyqvoQyvEEXsyD02.png

④、hello.dsp

出现下图执行结果,表示新扩展骨架生成成功。

https://file.lulublog.cn/images/3/2022/08/E9R7BhJ91hn247NN1HhMFFSP01f4sF.png

现在打开F:\php-sdk\php56dev\vc11\x86\php-5.6.38-src\ext可以看到 hello 文件夹。进入 hello 可以看到 hello.dsp,它就是 VS 的项目文件。

https://file.lulublog.cn/images/3/2022/08/BsBlzBL7bosfgFf74GMYwWzMubBBuO.png

四、编译扩展

①、默认函数

目前新建的扩展中并未创建任何函数接口,但默认的扩展为我们提供了一个测试的函数接口,默认函数的命名规则是:confirm_[extname]_compiled,函数接口:tring confirm_[extname]_compiled(string)。

②、用 vs2012 打开 hello.dsp

③、设置运行库

右键项目:属性-》配置属性-》C/C++-》代码生成,设置运行库:多线程 DLL (/MD)

④、设置编译

右键项目:属性-》配置属性-》C/C++-》高级,设置编译为:编译为 C 代码 (/TC)

⑤、设置活动解决方案配置

右键项目:属性-》配置管理器(右上角)-》活动解决方案,设置:Release_TS

⑥、设置输出文件

右键项目:属性-》配置属性-》链接器》常规,设置输出文件:Release_TS/php_hello.dll。如果不设置,当编译生成扩展后,找起来会比较麻烦。所以这项设置不是必须的。

⑦、增加附加库

解压 php-5.6.38-Win32-VC11-x86.zip 到 F:\

右键项目:属性-》配置属性-》链接器》常规,增加附加库目录:F:\php-5.6.38-Win32-VC11-x86\dev。如果不设置此选项,编译时会报:无法打开输入文件"php5ts.lib"

⑧、最后按F5,执行编译。会生成php_hello.dll

https://file.lulublog.cn/images/3/2022/08/qnb5kCqIh6b5X5qBQ5i8CaB8Bh8xqq.png

成功1个,表示dll生成成功。

生成的文件在:F:\php-sdk\php56dev\vc11\x86\php-5.6.38-src\ext\hello\Release_TS 目录下

https://file.lulublog.cn/images/3/2022/08/HEzTO4oB7JM46nNBzC4zJm6p51eXOr.png

五、使用扩展

①、可以使用 php_hello.php 的 php 版本 

由于我们用的是 php-5.6.38-Win32-VC11-x86.zip,所以该扩展只能用在 5.6 Thread Safe (TS) x86 

②、拷贝 php_hello.dll 至 F:\php-5.6.38-Win32-VC11-x86\ext下 

③、打开 F:\php-5.6.38-Win32-VC11-x86\php.ini,添加 extension=php_hello.dll 

④、新建 test.php 

echo confirm_my_fopen_compiled("test");

⑤、执行结果 

Congratulations! You have successfully modified ext/hello/config.m4. Module test is now compiled into PHP.

六、编译新扩展遇到的问题

①、fatal error C1902: 程序数据库管理器不匹配;请检查安装
mspdbsrv.exe 或 mspdbcore.dll 丢失或者其版本和 mspdb110.dll 的版本不同,确定这三个文件的相同版本安装在系统里。
在 VC 安装目录下的\Common7\IDE 目录下拷贝这三个文件到安装目录下的 VC\bin 下即可
②、../main/config.w32.h 打开失败
PHP 源码进行 configure 后才会产生 config.w32.h
③、无法打开输入文件"php5ts.lib"
设置工程属性页中的C++->高级->编译为改为编译为C代码(/TC),链接器->附加库目录加一项PHP二进制包的dev目录。

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开微信扫一扫,即可进行扫码打赏哦

阅读 505