PHP7 扩展开发(一) 在 Windows 下编译

编辑于 2016-08-11

* 移动设备下, 可左滑手指以查看较宽代码

上一篇文章在 Linux / macOS 下生成扩展骨架并编译,这个骨架在 Windows 上面也是可直接编译的。

环境准备

PHP7 是由 VC14(也就是 Visual Studio 2015) 编译的,所以运行它之前需要安装 VC14 运行库,编译它则需要安装 Visual Studio 2015。

需要从 官网 下载 PHP7 的源代码包和已编译的 PHP 程序,再分别解压,得到两个目录(假设在 C 盘):

C:\php7-src

C:\php7-Win32-VC14-x64-ts

如何编译

1)拿到要编译的代码,在 VS 2015 菜单中选择「文件」-「新建」-「从现有代码创建项目」,然后在弹出窗口中选择你要编译的代码,类型选择「动态库(dll)」。

2)此时 VS 2015 打开了项目,把工具栏中的「Debug」改为「Release」,在菜单中选择「项目」-「属性」。然后在弹出窗口的左侧「常规」栏目下,「配置类型」选择为「动态库(.dll)」:

vs2015

3)然后在左侧「C/C++」-「常规」栏目下,「附加包含目录」中,加入:

C:\php7-src\php-7.0.16-src
C:\php7-src\php-7.0.16-src\main
C:\php7-src\php-7.0.16-src\TSRM
C:\php7-src\php-7.0.16-src\Zend

4)接着在左侧「C/C++」-「预处理器」栏目下,「预处理器定义」中,加入:

ZEND_DEBUG=0
PHP_EXTENSION
PHP_WIN32
ZEND_WIN32
HAVE_XXX=1
COMPILE_DL_XXX
ZTS

注意,要把上面的 XXX 改为大写的扩展名 (如扩展叫 tonyenc 就把 XXX 改成 TONYENC),否则 PHP 将无法识别扩展。ZTS用于告诉编译器开启线程安全(如果去掉就是不开启)。注意,线程安全的开启与否,取决于前面下载到的 C:\php7-Win32-VC14-x64-ts,它也是启用了线程安全编译,所以这里开启线程安全。

5)在左侧「连接器」-「输入」栏目下,「附加依赖项目」中,加入:C:\php7-Win32-VC14-x64-ts\dev\php7ts.lib,即前面下载得到的已编译的 PHP 程序。

6)点确定,然后菜单中选择「生成」-「生成解决方案」,恭喜你,编译器报错:无法打开包括文件 ../main/config.w32.h,这时把 C:\php7-Win32-VC14-x64-ts\win32\build\config.w32.h.in 复制到 C:\php7-Win32-VC14-x64-ts\main\config.w32.h (注意没有了后面的 in),然后在 config.w32.h 中加入:

#define PHP_COMPILER_ID "VC14"

这将指明运行库是 VC14,与前面下载到的已编译 PHP 程序匹配,重新生成下解决方案,这样就能成功编译了!

你是不是也在想,Windows 下面编译真麻烦?