[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-develpackage - Run
phpizeto generate theconfigurescript fromconfig.m4. - Run
./configure --enable-helloto generate theMakefile - Run
maketo 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 ...
随机推荐
- PyQt的signal 和 solit的补充
from PyQt5.QtWidgets import (QWidget , QVBoxLayout , QHBoxLayout, QLineEdit, QPushButton) from PyQt5 ...
- image 和 barplot 的组合
代码示例: par(mfrow = c(1, 2)) par(mar = c(1, 10, 1, 0), las = 1, ann = F) image(1:10, 1:10, matrix(samp ...
- 【苏勇老师Linux 入门笔记】网络基础
IP 地址 IP 编制时一个双层编制方案,一个 IP 地址标示一个主机 (或一个网卡接口). 一个 IP 地址分为两个部分:网络部分(所属区域)和主机部分(标示区域中的哪个主机).IPv4 共32位, ...
- asp.net操作cookie类,包含datatable批量存入cookie
以下是类: public class CookieMgr { #region 快速储存Cookie /// <summary> /// 快速储存Cookie /// </summar ...
- java新手的session初体验
众所周知,session作为保存我们用户对话所需要的信息的对象,在我们的项目中必不可少.作为菜鸟学习java的第一课就是了解它的思想和用法,在以后的学习中,逐渐学习和总结,从基础到高级,慢慢学会应用. ...
- 近5年常考Java面试题及答案整理(一)
下列面试题都是在网上收集的,本人抱着学习的态度找了下参考答案,有不足的地方还请指正. 1.面向对象的特征有哪些方面? 抽象:将同类对象的共同特征提取出来构造类. 继承:基于基类创建新类. 封装:将数据 ...
- spring+mybatise注解实现
spring+mybatise注解实现 spring.jpa.database=MYSQL spring.datasource.type=com.alibaba.druid.pool.DruidDat ...
- Ubuntu 16.04服务器 软件的安装及配置
SSH的安装及配置 SSH分客户端openssh-client和openssh-server 如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果没有则 ...
- GoF--适配器设计模式
1.概念: 适配器模式(Adapter Pattern)把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 2.形式 a.类的适配器模式 ...
- Windows 7 无密码文件共享
Windows7中创建无密码的文件共享的几个步骤: 在“控制面板\所有控制面板项\网络和共享中心\高级共享设置”开启“关闭密码保护共享”和“启用文件和打印机共享”.关闭密码保护共享的操作会启用Gues ...