WinNT下如何自主编译安装friso以及其php扩展robbe

狮子的魂 发布于 2013/11/28 16:13
阅读 4K+
收藏 5

friso以及robbe内部自带的dll共享文件都是在win32下编译的。近些时间有不少网友问到了friso和robbe的64bit的支持问题。 由于本人没有64bit系统,依据在Win32下的编译过程,在写上一份教程,供需要的哥们参考下,(64bit系统步骤肯定是一样的,但是操作是否一样请对照着自己思考下啦。。。),也希望编译过的哥们能够写一份教程供大家参考下。。。

当然这也可以作为编译friso,或者编译php扩展的一个教程。


一。使用VS编译friso得到friso.dll

我使用的是vs2010, 其他的版本的vs没用过,但是应该差不多啦。

1. 新建工程:

这里为了方便,我是选择从现有的代码中创建项目:文件->新建->从现有的代码中创建项目

(这里注意:请先将friso源码中的tst-开头的c文件去掉,这些都是测试程序,不需要编译到friso.dll文件中去, 而且使用的是UTF-8编码, 里面的中文会导致cl编译器的错误)

(1). 项目类型选择为visual c++: 

(2). 选择项目的位置:


(3). 选择项目类型为:"动态链接库(dll)项目"

(4). 完成 (点击完成即可)

(5). 编辑项目属性,加上时间优化:

选择Release | Win32 (64bit系统肯定就不是win32了), 右键选择属性,默认的面板中->全程序优化->使用连接时间代码生成 :

(6). 编译生成项目得到friso.dll

点击生成Friso. 

或略cl对fopen的警告信息,

如果没有出现错误,你会在项目的Release下得到一个friso.dll和friso.lib文件.

如果出现了错误:

请对friso_API.h做如下修改:

(从15行开始)

#ifdef _WIN32
#	define FRISO_API extern __declspec(dllexport)
#	define __STATIC_API__ static
#else
/*platform shared library statement :: unix*/
#	define FRISO_API extern
#	define __STATIC_API__ static inline
#endif


64bit的系统中,#ifdef _WIN32是不会成立的。


直接将代码改成如下:

#define FRISO_API extern __declspec(dllexport)
#define __STATIC_API__ static
然后再编译就ok了。 (我没试过,错误了,麻烦反馈一下。


二。使用vc6或者vs生成php_robbe.dll

robbe是依赖于friso的,robbe的工作过是直接调用了friso的函数来完成的,所以你必须要完成第一步的工作,得到friso.dll

1. 下载源码准备好环境:

在WinNT下编译php扩展还真是有些麻烦的,以下的工作是我在win32下必须的工作,64bit是否需要请按照步骤自己核对。

(1). 到php官方网站下载最新版本的php源码并且解压, 设路径为{PHP_SRC_DIR}。

(2). 下载:(我不确定64bit的系统是否需要)
http://www.php.net/extra/bindlib_w32.zip
http://www.php.net/extra/win32build.zip
将这两个包放在一起,我把它们放在win32/build目录下

(3). 生成得到main/config.win32.h: (兴许64bit系统不需要)

然后执行php源码包根目录下的buildconf.bat(最好在命令行运行,不然显示结果会一闪而过)
然后把bison.exe(在刚下载的包里面)所在的目录设置为环境变量,再运行configure.bat。完后就生成成/main/config.w32.h这个文件了。

(4). 如果接下来的编译出现类似如下错误:

..\..\main\streams/php_stream_transport.h(85) : error C2143: syntax error : missing ')' before '*'
..\..\main\streams/php_stream_transport.h(85) : error C2081: 'socklen_t' : name in formal parameter list illegal

请找到main/streams/php_stream_transport.h 加上一个:typedef typedef int socklen_t


2. 开始编译得到php_robbe.dll:

(1). 下载最新版本的robbe源码,建议从git@oschttp://git.oschina.net/lionsoul/robbe

如果是:Win64你可能还需要使用cygwin或者更改skelone来创建一个扩展。

(2). 将附件中的src拷贝到{PHP_SRC_DIR}/ext/下,并且重命名为robbe.(Win32),  或者在64bit中将下载下来的robbe源码的里面的php_robbe.h和friso.h, friso_API.h以及robbe.c拷贝到你新创建的扩展中覆盖原来的。

(3). 将你的php二进制包中的dev/php5ts.lib.lib拷贝到{PHP_SRC_DIR}/ext/robbe下.

(4). 使用vc编译:

打开cmd, cd到{PHP_SRC_DIR}/ext/robbe

运行如下命令:(msdev来自vc) (64bit的查看下robbe.dsp文件,对比下来)


$ msdev robbe.dsp /MAKE "robbe - Win32 Release_TS"




如果你的环境搭建成功了,你会在{PHP_SRC_DIR}/Release_TS文件夹下找到一个php_robbe.dll

(5). 或者使用vs编译:

使用vs打开{PHP_SRC_DIR}/ext/robbe/robbe.dsp, 提示是否转换, 点击“是”转换一下吧。

打开后,选择Rlease_TS | Win32 (b4bit的对照一下), 右键-》属性->通用属性->常规->全程序优化选择为为:是用链接时间代码生成. 应用/确定即可。

然后选择:生成->生成robbe. (注意编译的是Release_TS):

生成:

同样的如果成功了,你会在{PHP_SRC_DIR}/Rlease_TS下得到php_robbe.dll。


三。在PHP中开始使用robbe:

1. 将得到的friso.dll放置在系统的path路径下,robbe的工作室完全调用了friso的函数来完成的,所以需要以来于friso.dll, 也就是让php找到friso.dll, 通常我是直接放置在C:/Windows下的。

2. 将得到的php_robbe.dll放置到php二进制包的ext下。

3. 在php.ini中加入php_robbe.dll配置一下就可以工作了。 robbe安装配置教程

加载中
0
KDash
KDash
先收藏, 等会去试试....
0
pyruby
pyruby
我这里没有win64可选啊,我的操作系统是win64位的
0
狮子的魂
狮子的魂

引用来自“宝仔love”的答案

我这里没有win64可选啊,我的操作系统是win64位的

你用的是下载下来的扩展???

在64bit下, 你可能需要自己同你skel生成一个扩展, 然后在将php_robbe.h,robbe.c, friso.h, friso_API.h拷贝到扩展中覆盖原来的.  下载下来的扩展是在win32系统生成的...

0
pyruby
pyruby

引用来自“狮子的魂”的答案

引用来自“宝仔love”的答案

我这里没有win64可选啊,我的操作系统是win64位的

你用的是下载下来的扩展???

在64bit下, 你可能需要自己同你skel生成一个扩展, 然后在将php_robbe.h,robbe.c, friso.h, friso_API.h拷贝到扩展中覆盖原来的.  下载下来的扩展是在win32系统生成的...

没有呀,我是第一步,根据你的源码包(friso/src)要生成64bit的friso.dll
0
狮子的魂
狮子的魂

引用来自“宝仔love”的答案

引用来自“狮子的魂”的答案

引用来自“宝仔love”的答案

我这里没有win64可选啊,我的操作系统是win64位的

你用的是下载下来的扩展???

在64bit下, 你可能需要自己同你skel生成一个扩展, 然后在将php_robbe.h,robbe.c, friso.h, friso_API.h拷贝到扩展中覆盖原来的.  下载下来的扩展是在win32系统生成的...

没有呀,我是第一步,根据你的源码包(friso/src)要生成64bit的friso.dll

没有64, 就选32啦, 编译完之后, 测试以下就知道了, 64bit的我也没试过...

0
pyruby
pyruby

引用来自“狮子的魂”的答案

引用来自“宝仔love”的答案

引用来自“狮子的魂”的答案

引用来自“宝仔love”的答案

我这里没有win64可选啊,我的操作系统是win64位的

你用的是下载下来的扩展???

在64bit下, 你可能需要自己同你skel生成一个扩展, 然后在将php_robbe.h,robbe.c, friso.h, friso_API.h拷贝到扩展中覆盖原来的.  下载下来的扩展是在win32系统生成的...

没有呀,我是第一步,根据你的源码包(friso/src)要生成64bit的friso.dll

没有64, 就选32啦, 编译完之后, 测试以下就知道了, 64bit的我也没试过...

http://www.php.net/extra/bindlib_w32.zip

http://www.php.net/extra/win32build.zip

这2个你给的地址下了没用,文件已损坏,无法解压

狮子的魂
狮子的魂
那是你没下载好吧. 这个是32bit的过程. 64bit的不一定需要这个, 你去编译就知道了. 如果提示出错了, 再去找这些东西.
0
阿恺
阿恺

在VS2010中编译,出现如下错误,我该如何解决?

1>------ 已启动生成: 项目: Friso, 配置: Release Win32 ------
1>LINK : warning LNK4075: 忽略“/INCREMENTAL”(由于“/LTCG”规范)
1>     正在创建库 D:\Soft\friso\src\Release\Friso.lib 和对象 D:\Soft\friso\src\Release\Friso.exp
1>  正在生成代码
1>  已完成代码的生成
1>LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

0
狮子的魂
狮子的魂

引用来自“阿恺”的答案

在VS2010中编译,出现如下错误,我该如何解决?

1>------ 已启动生成: 项目: Friso, 配置: Release Win32 ------
1>LINK : warning LNK4075: 忽略“/INCREMENTAL”(由于“/LTCG”规范)
1>     正在创建库 D:\Soft\friso\src\Release\Friso.lib 和对象 D:\Soft\friso\src\Release\Friso.exp
1>  正在生成代码
1>  已完成代码的生成
1>LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

设置一下VS:

    项目|项目属性|配置属性|清单工具|输入和输出|嵌入清单 “是”改为“否” 即可。

0
阿恺
阿恺

引用来自“狮子的魂”的答案

引用来自“阿恺”的答案

在VS2010中编译,出现如下错误,我该如何解决?

1>------ 已启动生成: 项目: Friso, 配置: Release Win32 ------
1>LINK : warning LNK4075: 忽略“/INCREMENTAL”(由于“/LTCG”规范)
1>     正在创建库 D:\Soft\friso\src\Release\Friso.lib 和对象 D:\Soft\friso\src\Release\Friso.exp
1>  正在生成代码
1>  已完成代码的生成
1>LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

设置一下VS:

    项目|项目属性|配置属性|清单工具|输入和输出|嵌入清单 “是”改为“否” 即可。

谢谢您,太谢谢您。编译一下子就成功了。

0
狮子的魂
狮子的魂

引用来自“阿恺”的答案

引用来自“狮子的魂”的答案

引用来自“阿恺”的答案

在VS2010中编译,出现如下错误,我该如何解决?

1>------ 已启动生成: 项目: Friso, 配置: Release Win32 ------
1>LINK : warning LNK4075: 忽略“/INCREMENTAL”(由于“/LTCG”规范)
1>     正在创建库 D:\Soft\friso\src\Release\Friso.lib 和对象 D:\Soft\friso\src\Release\Friso.exp
1>  正在生成代码
1>  已完成代码的生成
1>LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

设置一下VS:

    项目|项目属性|配置属性|清单工具|输入和输出|嵌入清单 “是”改为“否” 即可。

谢谢您,太谢谢您。编译一下子就成功了。

返回顶部
顶部