[PHP] Compile an extension on Windows
https://wiki.php.net/internals/windows/stepbystepbuild
http://blog.benoitblanchon.fr/build-php-extension-on-windows/
https://wiki.php.net/internals/windows/libs
[PHP] Compile an extension on Windows
20 Jan 2015 PHP
I recently wrote a PHP extension and while the documentation is very clear on how to build it on Linux, there is not so much information on how to compile an extension on Windows.
This article explains how to build a PHP extension with Visual Studio.
Requirements
This guide assumes that you wrote a "Hello World" PHP extension as described here and that you compiled it successfully on Linux.
To build your extension on Windows, you'll need:
- Visual Studio (I tested with Visual Studio 2013 Update 4)
- The PHP source code (I tested with PHP 5.5.20)
In the rest of this article, I assume that:
- The PHP source code is located in
C:\php-src
- Your "Hello World" extension source code is located in
C:\MyPhpExtensions\hello
The build process on Linux
You should already familiar with the process, but here is a reminder:
- Install
php-devel
package - Run
phpize
to generate theconfigure
script fromconfig.m4
. - Run
./configure --enable-hello
to generate theMakefile
- Run
make
to build the extension
From config.m4
to config.w32
On Windows, config.m4
is replaced by config.w32
which has a different format.
Migrating from config.m4
to config.w32
is really straighforward, you just need to translate the automake syntax to JavaScript.
Here is a minimalist example:
ARG_ENABLE("hello", "Hello World support", "no");
if (PHP_HELLO != "no") {
EXTENSION("hello", "php_hello.c", true);
}
Don't forget the true
as the third argument of the EXTENSION
function, it means that we want a DLL instead of a static library.
If you need more information on the syntax, look at the existing config.w32
in the PHP source code.
From phpize
to buildconf.bat
On Windows, you don't call phpize
but instead you call buildconf.bat
.
Open a Visual Studio developer command prompt (either 64 or 32 bit), and run
cd C:\php-src
buildconf.bat --add-modules-dir=C:\MyPhpExtensions
buildconf.bat
will scan each subfolder of C:\MyPhpExtensions
looking for config.w32
files.
It will then generate a configure.bat
.
From ./configure
to configure.bat
The configure
script that you used on Linux did exactly what you wanted: it just built the extension.
But on Windows it's different because the script is designed to build PHP itself.
You need to add command line options to configure.bat
to build the minimum number of stuff, so as to make sure that you wont have to solve dependencies to external libraries
cd C:\php-src
configure.bat --disable-all --enable-cli --enable-hello
--disable-all
is a shortcut for all the --disable-xxx
and --without-xxx
flags, --enable-cli
enables back the PHP command line interface (ie php.exe
) and --enable-hello
enables your "Hello World" extension.
By default, this will create a "Thread Safe" build.
If you want a non thread safe build, just add --disable-zts
to the command line.
From Make
to NMake
configure.bat
generated a Makefile
for the Microsoft version of Make
.
To start the build, just run:
nmake
This will build your PHP extension, as well as php.exe
.
This is handy because you'll need a php.exe
that matches the configuration of your extension.
Indeed, in order to be loaded in PHP, your extension must match the PHP build in term of:
- word size (32 or 64 bits)
- thread safety (TS build or NTS build)
- compiler version (VS9, VS11 etc.)
If you really don't need to build php.exe
, you can use this command line:
nmake php_hello.dll
Thousands of warnings
During the compilation of PHP, the compiler issues a lot of warnings.
If you want to prevent this, just add the following file to c:\php-src\win32\build\config.w32
:
ADD_FLAG('CFLAGS', ' /wd4005 /wd4267 /wd4244 ');
ADD_FLAG('CFLAGS_BD_ZEND', ' /wd4018 /wd4101 /wd4090 /wd4273 ');
ADD_FLAG('CFLAGS_BD_MAIN', ' /wd4018 /wd4090 ');
ADD_FLAG('CFLAGS_BD_MAIN_STREAMS', ' /wd4013 ');
DEFINE('RC', '$(RC) /nologo /d _USING_V110_SDK71_');
Also, add the following line to C:\php-src\ext\standard\config.w32
:
ADD_FLAG('CFLAGS_BD_EXT_STANDARD', ' /wd4047 /wd4018 ');
And finally, add this line to C:\php-src\sapi\cli\config.w32
:
ADD_FLAG('CFLAGS_BD_SAPI_CLI', ' /wd4018 ');
Bonus: best resources on PHP extension development
- Extension Writing Part I: Introduction to PHP and Zend
- Extension Writing Part II: Parameters, Arrays, and ZVALs
- Extension Writing Part II: Parameters, Arrays, and ZVALs [continued]
- Extension Writing Part III: Resources
- Wrapping C++ Classes in a PHP Extension
- PHP Extension Writing
- PHP Extensions Made Eldrich: Working with the API – the PHP C API
- PHP Extensions Made Eldrich: Classes
- Build your own PHP on Windows
- PHP Internals Book
- Zend API: Hacking the Core of PHP
[PHP] Compile an extension on Windows的更多相关文章
- Jenkins邮件扩展(Email Extension插件 Windows环境)
1.Jenkins ver. 2.107.3版本自带Email Extension插件启动后即可看到系统设置里的 Extended E-mail Notification ,如果没有请安装 2.安装过 ...
- build-qt.sh(Cross compile in Linux for Windows)
#!/bin/bash set -e MINGW=${MINGW:-${ARCH:-x86_64}-w64-mingw32} PREFIX=${PREFIX:-usr} WORKSPACE=${WOR ...
- windows 10 上源码编译OpenCV并支持CUDA | compile opencv with CUDA support on windows 10
本文首发于个人博客https://kezunlin.me/post/6580691f/,欢迎阅读! compile opencv with CUDA support on windows 10 Ser ...
- Windows下apache php wordpress配置
2. Use notepad to open httpd.conf config file. Make use the line "LoadModule rewrite_module mod ...
- 一步步实现windows版ijkplayer系列文章之六——SDL2源码分析之OpenGL ES在windows上的渲染过程
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
- A Great List of Windows Tools
Windows is an extremely effective and a an efficient operating system. Like any other operating syst ...
- Windows 7操作系统下PHP 7的安装与配置(图文详解)
前提博客 Windows 7操作系统下Apache的安装与配置(图文详解) 从官网下载 PHP的官网 http://www.php.net/ 特意,新建这么一个目录 ...
- Windows phone应用开发[20]-禁止Pivot手势
相比Ios 和Android. Windows Phone 控件库中多了两个比较特殊的空间Pivot 枢轴和Panamera 全景视图控件.在基于枢轴控件Pivot中我们经常会碰到一些比较特殊应用场景 ...
- 将Win8.1/WP8.1应用迁移到Universal Windows Platform
在上一篇在VS2015 RC打开CTP中创建的工程,我们介绍了怎么在RC中打开CTP中创建的Universal 工程,这一篇我们来讲下怎么将Windows 8.1/WP8.1的应用迁移到Univers ...
随机推荐
- XP远程桌面连接2008提示:远程计算机需要网络级别身份验证,而您的计算机不支持该验证
原文链接:http://kong62.blog.163.com/blog/static/1760923052011319113044653/ 解决办法: 修改注册表2个地方 开始-运行-regedit ...
- IntelliJ IDEA Default Keymap
Alt+回车 导入包,自动修正Ctrl+N 查找类Ctrl+Shift+N 查找文件Ctrl+Alt+L 格式化代码Ctrl+Alt+O 优化导入的类和包Alt+Insert 生成代码(如get ...
- JavaSE(二)之继承、封装、多态
学习完类与对象终于认识到什么是类,什么是对象了.接下来要看的就是java的三大特征:继承.封装.多态. 一.封装(数据的隐藏) 在定义一个对象的特性的时候,有必要决定这些特性的可见性,即哪些特性对外部 ...
- java项目中的路径获取,request
java web项目中获取项目根路径(tomcat可运行的web源码的路径)的方式: 分为两种情况: 情况一: 在eclipse.inde等开发工具中获取(注:如下代码所在的类必须是控制层所在包下的类 ...
- UNIX环境编程学习笔记(27)——多线程编程(二):控制线程属性
lienhua342014-11-09 1 线程属性概括 POSIX 线程的主要属性包括 scope 属性.detach 属性.堆栈地址.堆栈大小.优先级.在头文件 pthread.h 中定义了结构体 ...
- UNIX环境编程学习笔记(16)——进程管理之进程环境变量
lienhua342014-10-03 1 环境表和环境指针 在每个进程启动时,都会接到一张环境表.环境表是一个字符指针数组,其中每个指针包含一个以 null 结束的 C 字符串的地址.全局变量env ...
- java中*和**的作用
“*”就表示了所有的文件,但是“*”并不包括子目录下的文件: “**”匹配包含任意级子目录中所有的文件
- JSP转发和重定向的区别
重定向: response.sendRedirect("地址"); a. 页面地址显示最终页面 b. 不可向后传递参数 c. 跳到外 ...
- [Scikit-learn] 2.1 Clustering - Gaussian mixture models & EM
原理请观良心视频:机器学习课程 Expectation Maximisation Expectation-maximization is a well-founded statistical algo ...
- Tree Recovery(前序中序求后序)
Tree Recovery Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14640 Accepted: 9091 De ...