下载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. 浏览器浏览记忆(history)几则技巧记录

    一般浏览记录模式 假设有三个页面, start.html, 通过点击start.html上的链接跳转到 first.html, 然后点击first.html上链接跳转到 second.html, 那么 ...

  2. LUA OOP编程实现方法

    lua原生不支持OOP特性 确实如此, 同时可以采用其它lua代码的方式实现OOP的特性. OOP四大特性 抽象 封装 继承 多态 http://www.cnblogs.com/xiaosongluf ...

  3. Dijkstar算法的数学原理

    Dijkstar算法是荷兰数学家迪克斯屈拉(or迪杰斯特拉?)在1959年发现的一个算法.是现有的几个求带权图中两个顶点之间最短通路的算法之一.算是一个相当经典的算法了. 迪克斯屈拉算法应用于无向连通 ...

  4. 使用 Redis 实现排行榜功能 (转载 https://segmentfault.com/a/1190000002694239)

    排行榜功能是一个很普遍的需求.使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择. 一般排行榜都是有实效性的,比如"用户积分榜".如果没有实效性一直按照总榜来排,可能榜 ...

  5. Android -- 是时候来了解一波EventBus了

    1,最早在项目中使用EventBus是在去年的时候,但自己一直没抽出时间来记录记录一下,今天就来简单的使用一下,先看一下EventBus的定义是什么 EventBus:是一个发布 / 订阅的事件总线. ...

  6. 弹性伸缩布局flex

    Flex 布局教程:语法篇   作者: 阮一峰 日期: 2015年7月10日 网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + posi ...

  7. 混合使用 ForkJoin, Akka, Future 实现一千万个不重复整数的排序

    定位  本文适合于想要了解新语言 Scala 以及异步并发编程框架 Akka, Future 的筒鞋. 读完本文后,将了解如何使用 ForkJoin 框架.如何使用 Akka 构建并发程序.如何使用 ...

  8. aaaaaaaaaaaaaaa

    <?xml version="1.0" encoding="utf-8"?><document> <!-- 签名,由平台生成 -- ...

  9. SVN merge的主干,分支的相互合并操作

    本文只研究了 在本地如何进行主干,分支的相互合并 的操作:从主干到分支,从分支到主干. 本地客户端工具是tortoisesvn 测试用例. 1.本地添加test文件夹 在test文件夹下分别建立tru ...

  10. zigbee学习之路(三):按键的控制

    一.前言 通过前一次的实验,相信大家都已经对cc2530程序的编写有了一定的认识,这次我们来操作和实验的是cc2530上的按键模块. 二.原理分析 我们先来看一下按键的原理图: 根据原理图我们可以得出 ...