下载VC2012,安装
打开CMD 须运行 vcvars32.bat (初始化VC编译环境)

下载PHP WIN编译包:http://windows.php.net/downloads/php-sdk/
    下载:
        php-sdk-binary-tools-20110915.zip
    解压,CMD进入该目录,运行
    bin\phpsdk_setvars.bat
    bin\phpsdk_buildtree.bat php5dev
    会在当前目录下生成 php5dev 文件夹
    根据你的VC版本,需要编译版本,进入 php5dev/vc*/x**/
    会有 deps 文件夹,根据PHP版本下载:
        deps-5.*-vc11-x86.7z
    解压把压缩包里的deps内容放入当前文件夹的deps目录中
    根据PHP版本下载PHP源码:http://php.net/downloads.php
    下载php-5.*.*.tar.gz 解压到当前目录:php5dev/vc*/x**/
    进入php源码目录执行:
        #生成configure文件
        buildconf
        #生成Makefile文件
        configure --enable-**
        #根据需求添加指定扩展
        #如果需要把扩展编译成DLL,编译参数为:
        --enable-**=shared
        #执行编译
        nmake
        编译出来的文件在 Release_TS

只编译指定扩展可以使用 configure --disable-all --enable-cli --enable-***=shared

一般出现php5ts.dll.def : error LNK2001: 无法解析的外部符号 ** 表示依赖的外部库没找到
使用外部库:
    在执行了 configure 后会在源码目录生成 Makefile 文件,修改该文件
    1. 添加库目录:
    LDFLAGS=/nologo /libpath:"E:\php\phpsdk\php55dev\vc9\x86\deps\lib" /libpath:"你的库LIB目录"  
    2. 添加头文件
    CFLAGS=/nologo /FD ...(略)  /I "你的include头文件目录"  /D FD_SETSIZE=256
    3. 指定库
    LIBS=kernel32.lib ...(略) 你的库.lib

编译你的扩展
    在PHP源码目录 ext 添加扩展
    在WIN下编译扩展的配置文件为:config.w32 必须要有该文件 非 config.m4
    config.w32 文件注解
    #表示编译参数,同时会有 PHP_TEST 变量 如果第三个参数为 yes 表示默认编译
    ARG_ENABLE("test", "for php_test support", "no");
    #一般会有这个判断 表示要编译才添加编译扩展
    if (PHP_TEST == "yes") {
        #参数1 编译名
        #参数2 所有的C文件
        #参数3 null 表示共享编译 true 表示编译进PHP
        EXTENSION("screw", "**.c **.h /*你的C文件*/", null);
    }

配置函数及注释

/**
* 外部扩展,定义变量
* @param optname 扩展名
* @param helptext 帮助提示
* @param defval 默认值
*/
function ARG_WITH(optname, helptext, defval)
/**
* 内部扩展,定义变量
* @param optname 扩展名
* @param helptext 帮助提醒
* @param defval 默认值
*/
function ARG_ENABLE(optname, helptext, defval)
//添加后悔创建对应的全局变量
PHP_{OPTNAME} = "yes"||"no"
PHP_{OPTNAME}_SHARED = "shared"||true||false /**
* 定义 存在删除删除标记
* @param name 字段名
* @param value 字段值
*/
function DEFINE(name, value) /**
* 检查LIB是否存在,存在会定义标记
* LIBS_{LIBNAMES}
* LDFLAGS_{LIBNAMES}
* @param libnames 库名 多个用;号隔开
* @param target 目标名 编译参数 LIBS_{TARGET}
* @param path_to_check 检查路径 默认为空
* @param common_name 组件名 默认为 target
* @returns {Boolean}
*/
function CHECK_LIB(libnames, target, path_to_check, common_name)
  例
  CHECK_LIB("pthreadVSE1.lib", "pthread", "E:\\php\\pthreads-built\\lib") /**
* 检查指定头文件是否有指定函数
* @param header_name 头文件
* @param func_name 函数名
* @param path_to_check 文件路径
* @param add_to_flag 是否添加标记
* @returns {Boolean}
*/
function CHECK_FUNC_IN_HEADER(header_name, func_name, path_to_check, add_to_flag) /**
* 通过正则表达式匹配文件内容
* @param header_name 文件名
* @param regex 正则表达式
* @param path_to_check 路径
* @returns {Boolean}
*/
function GREP_HEADER(header_name, regex, path_to_check) /**
* 检测头文件并 并加入目录
* @param header_name 头文件
* @param flag_name 完整标记
* @param path_to_check 检测路径
* @param use_env 使用环境变
* @param add_dir_part 添加路径
* @param add_to_flag_only
* @returns {Boolean}
*/
function CHECK_HEADER_ADD_INCLUDE(header_name, flag_name, path_to_check, use_env, add_dir_part, add_to_flag_only) 例如:
CHECK_HEADER_ADD_INCLUDE("zookeeper.h", "CFLAGS", '..\\src\\c\\include;'); /**
* 添加DIST文件
* @param filename
*/
function ADD_DIST_FILE(filename) /**
* 添加扩展依赖DEP文件
* @param extname 扩展名
* @param dependson 依赖扩展
* @param optional 依赖是否必须
*/
function ADD_EXTENSION_DEP(extname, dependson, optional) /**
* 声明扩展
* @param extname 扩展名
* @param file_list 编译文件列表
* @param shared 是否强制共享 传null使用编译参数,否则传扩展名
* @param cflags C标签,编译参数 如 /D ZLIB_EXPORTS /I "你的include头文件目录" 等
* @param dllname 编译出的dll文件名
* @param obj_dir
*/
function EXTENSION(extname, file_list, shared, cflags, dllname, obj_dir) /**
* 添加C源码
* @param dir 源码目录
* @param file_list 文件列表
* @param target 编译目标标签
* @param obj_dir
*/
function ADD_SOURCES(dir, file_list, target, obj_dir) /**
* 添加或修改自定义标签
* @param name 标签名
* @param flags 标签值
* @param 标签目标 (扩展名)
*/
function ADD_FLAG(name, flags, target) 例如:
加头文件
ADD_FLAG('CFLAGS', ' /I "..\\src\\c\\include" '); /**
* 添加DEF资源文件
* @param name 资源文件名
*/
function ADD_DEF_FILE(name) /**
* 添加全局头文件定义,通过此方式开控制扩展某些功能的启用
* @param name 常量名 一般以HAVE_开头
* @param value 常量值
* @param comment 注释
* @param quote 引用 即该常量值为其他常量值
*/
function AC_DEFINE(name, value, comment, quote) /**
* 添加头文件
* @param dir 目录
* @param headers_list 头文件列表 空格隔开
*/
function PHP_INSTALL_HEADERS(dir, headers_list) /**
* 输出消息
*/
function MESSAGE(msg)
/**
* 输出错误
*/
function ERROR(msg)
/**
* 输出警告
*/
function WARNING(msg)

php WIN下编译注意问题的更多相关文章

  1. 如何在win下编译thunderbird

    最近突然想研究一下thunderbird的实现,于是在WIN2K3下对其进行了系列的编译,特将编译的一些心得与大家共享.其实编译过程已经非常简单了,本文以VC8 ( VISUAL STUDIO 200 ...

  2. 解决 linux下编译make文件报错“/bin/bash^M: 坏的解释器:没有那个文件或目录” 问题

    PS背景:我在公司做sdk 的pc端开发,所以经常会在win下编译通过之后跑到linux下再运行一次已确保能支持多平台. 今儿在win下跑完一程序,然后放到linux下跑的时候,我用指令: [plai ...

  3. Windows下编译YouCompleteMe流程

    废话 生命在于折腾. 之前不用这个插件的原因: 因为要使这个插件起作用,前前后后需要下载几百MB(win下更是超过了1GB)的东西,包括了Clang编译器,ycmd的c艹源码还有ycm本身的vim s ...

  4. win下 golang 跨平台编译

    mac 下编译其他平台的执行文件方式请参看这篇文章,http://www.cnblogs.com/ghj1976/archive/2013/04/19/3030703.html  本篇文章是win下的 ...

  5. [原]在win上编译 subversion 源码实践Tonyfield的专栏

    (百度和网页的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。) [原]在win上编译 subversion 源码实践 2013-6-9阅读400 评论0 (参考 ...

  6. Centos 7环境下编译mysql 5.7

    首先在编译之前,我们要了解相关mysql 5.7的编译选项,官网编译选项地址:http://dev.mysql.com/doc/refman/5.7/en/source-configuration-o ...

  7. Windows下编译使用Aliyun OSS PHP SDK

    摘要: WIN环境下搭建Aliyun OSS PHP SDK编译运行环境.从PHP的安装逐步完成,SDK的编译运行.即使没有任何PHP基础,也能顺利完成. 安装环境:Win7 64 + PHP 5.6 ...

  8. Win下安装Cygwin中的SSH服务

    windows和linux各有其优越性,可以安装在同一台电脑上,但切换要重启.同时拥有两台电脑,一台装win,一台装linux,自然非常好,但具备此条件的不多.本文介绍cygwin,它可以让你在win ...

  9. windows下编译php7图形库php_ui.dll

    CSDN博客 具有图形化编程才有意思,这几天看到了php ui 图形扩展,只是现在只能下载php 7.1的 本次教程编译php7.2.6的 php ui 要是linux下编译起来比较简单 但是 win ...

随机推荐

  1. Android ListView 子控件点击事件

    android:descendantFocusability beforeDescendants:viewgroup会优先其子类控件而获取到焦点 afterDescendants:viewgroup只 ...

  2. Python基础二. 数据结构、控制流、运算符、真值测试

    一.概述 数据结构上广义上有两种,单一类型和集合类型 单一类型,表示一种对象 集合类型,表示包含多种对象 Python 中的内建的数据类型有str.list.tuple.dict.set.number ...

  3. iptables rule

    和H3C中的acl很像,或者就是一会事,这就是不知道底层的缺陷,形式一变,所有的积累都浮云了 参考准确的说copy from http://www.ibm.com/developerworks/cn/ ...

  4. Linux:安装OpenSSH-Server E:Package openssh-server has no installation candidate

    $sduo apt-get install openssh-server Reading package lists… Done Building dependency tree Reading st ...

  5. [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. PHP 教程

    PHP 教程 源地址 PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言. PHP 是免费的,并且使用非常广泛.同时,对于像微软 ASP 这样的竞争者来说,PHP 无疑是另一种高效率的选项. ...

  7. z/OS上Dataset 的移动

    最近的一个需求,需要把大批量的Dataset移到新的Storage Class,新的Volume中去,刚开始感觉非常头疼.仔细研究后发现这个事情其实很简单.确实符合别人所说,事情的在你真正开始努力之后 ...

  8. Hibernate Criteria Restrictions

    HQL运算符 QBC运算符 含义 = Restrictions.eq() 等于equal <>  Restrictions.ne() 不等于not equal >  Restrict ...

  9. web前端本地测试方法

    在大型项目中的前端测试与开发,通常使用git clone将整个工程目录下载下来,然后本地运行调试. 然而,当一个项目已经发布到测试机上,需要临时查看某个页面的效果或修改某个页面时,clone整个工程目 ...

  10. ruby on rails on windows

    这次想系统学会rails,最终目标是将redmine改造成顺手的工具,主要的手段就是开发redmine插件.虽然网上都推荐使用类Unix系统,可手头只有win7系统,就安装了. 难免会遇到这样那样的问 ...