您的位置:首页 > 编程语言 > PHP开发

php WIN下编译注意问题

2014-09-18 11:33 309 查看
下载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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: