Windows下编写php扩展(二)将linux下的php-cpp项目移植到windows

32 篇文章 0 订阅
8 篇文章 0 订阅

引言

linux下的php-cpp项目,这个项目生成动态链接库,使用这个动态链接库,可以快速地用C++开发php扩展。相比较php官方提供的,用c语言开发php扩展方案。php-cpp使得开发php扩展更加简单快捷。

php-cpp项目的官方网址是:http://www.php-cpp.com/
在github上的地址是:https://github.com/CopernicaMarketingSoftware/PHP-CPP

有一点比较遗憾,php-cpp官方目前只支持在类unix平台编译安装。还不支持在windows平台上的编译。本文尝试将php-cpp项目移植到windows平台。经过实验,发现这个移植工作比预想的要麻烦许多。

移植工作

下载php-cpp项目,解压后的文件夹结构如下图所示
在这里插入图片描述
注意到其中提供了CMakeLists.txt文件,这将是移植工作的起点

通过cmake 命令,可以解析该CMakeLists.txt文件,得到visual studio的解决方案文件。由于做实验的电脑上安装了visual studio 2017。 用cmake生成了vs2017的解决方案文件。所以电脑上应先安装cmake 与visual studio才能开始工作。

检查该CMakeLists.txt,发现还需要手工添加几个变量的定义

SET(PHPCPP_COMPILE_TS 1)
SET(PHPCPP_MSVCRT_STATIC 0)
SET(PHPCPP_ARCH "x86_64")
SET(PHPCPP_PHP_PATH "D:/php_work/php_cpp_workspace/for_php7.2.4/php-7.2.4.src")

其中 D:/php_work/php_cpp_workspace/for_php7.2.4/php-7.2.4.src目录下存放的是php的源代码

必须要指出,原作者提供的cmakelists.txt,显然没有经过验证,因为在用cmake时,会报找不到源文件的错误,我的处理方式简单,如果某一行报找不到文件,我就删除在cmakelists.txt 中的某一行。

比如:
include/fatalerror.h 这一行,就没有对应的源文件,所以删除了。
有一行比较特殊:
include/errors.h
在相应目录下有一个error.h文件,所以将这一行修改成了
include/error.h
将这些错误修正后,就可以得到vs2017的解决方案文件了。

在这里插入图片描述

用vs2017打开,基本界面如下:
在这里插入图片描述
可以看到解决方案中有4个项目,其实只有两个是有实际内容的,即 phpcpp与phpcpp-common两个项目。
如果现在就生成解决方案,将会得到一大堆警告与编译错误。

警告先不管它,但编译错误却不得不处理。

由于错误比较多,这里只将一些特别重大的错误列出来,有些错误目前还没有找到最好的解决方案,目前只是采用一些临时的改进措施,先让编译通过,以后再找更好的解决方法。

1.找不到 {phpSrc}/main/config.win32.h ,其中 {phpSrc}代表php源码所在的目录。解决方法是先用php_sdk_binary_tool生成config.win32.h。编译php的文献网上比较多,所以这一步工作在这里暂不细讲,可以参考这篇文献的前半部分进行

2.D:\Windows Kits\10\Include\10.0.17763.0\ucrt\sys/utime.h(101): error C2466: 不能分配常量大小为 0 的数组
在 main\config.w32.h 文件中
将"#define _USE_32BIT_TIME_T 1"注释

3.error C2375: “Php::constant”: 重定义;不同的链接
将出错行中的 PHPCPP_EXPORT 去掉,这是一个临时措施,并不是最好的解决方案

4 error C2131: 表达式的计算结果不是常数
gcc 支持变长数组,但vc++目前还不支持变长数组,目前暂用常量100代替argc,以后可考虑用vector更好地解决

5 error C2664: “BOOL FreeLibrary(HMODULE)”: 无法将参数 1 从“void *const ”转换为“HMODULE”
添加强制类型转换

编译错误解决后,接下来会出现大量的链接错误
比如:
zval.obj : error LNK2019: 无法解析的外部符号 “protected: __thiscall Php::Throwable::Throwable(struct _zend_object *)”

检查CMakeLists.txt,在源文件列表中没有 throwable.cpp。
看来这个CMakeLists.txt中的错误还不少,在前面做cmake时就发现包含了一些没有的文件,而这次发现把本该包含的文件又弄掉了,把这一类源文件都添加了vs项目中。

object.obj : error LNK2001: 无法解析的外部符号 __imp__efree@@4
这是由于不能链接到 php中的 php7ts.lib 造成的,将其加入vs项目,加入时要注意加上库目录与要链接的库php7ts.lib

经过这样一通折腾后,总算是通过编译,生成了phpcpp.dll。

补充说明一下,vs应配置为release,X64, 生成dll。原始的cmake 生成的vs项目中被配置为生成静态库.lib,所以要重新配置一下。

其实这里面还有不少零碎的小错误,一时难以尽述。我打算将编译通过的项目再仔细整理下,到时再提供一个真正完整好用的vs2017解决方案。

(补充说明:已移植到windows的phpcpp项目的完整的vs2017解决方案可在此 下载

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值