在Windows上编译PHP扩展组件的有关问题

php中文网
发布: 2016-06-13 13:25:59
原创
1114人浏览过

在Windows上编译PHP扩展组件的问题

?

有道小P
有道小P

有道小P,新一代AI全科学习助手,在学习中遇到任何问题都可以问我。

有道小P 64
查看详情 有道小P

这两天需要编译一个PHP扩展来实现特定的功能,参考了网上N多文章,最后发现两件宝贝,其一是php_screw,另外一件是Cygwin。
首先编译php_screw,以便有个感性的印象,编译通过没问题,然后自己试图往里增加一些代码,磕磕碰碰地最后也编译成功了。可是放到Apache上试用时,却经常出现内存读写异常,修修改改了好久还没无法解决。

于是,想自己重头开始做,参考php_screw往里一点点添代码,看看能不能解决问题。
根据网上教程,在Cygwin里用命令:
?php ext_skel_win32.php --extname=mytest
生成测试用程序框架,然后直接编译框架,一切都很顺利,再往里增加一个功能函数,放到Apache测试,也都正常,但到了往下面两个函数:
PHP_MINIT_FUNCTION(mytest)

PHP_MSHUTDOWN_FUNCTION(mytest)
的 return SUCCESS 前面增加
CG(extended_info) = 1;
,然后再编译,则出现了编译错误:

Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'.
--------------------Configuration: mytest - Win32 Debug_TS--------------------
Compiling...
mytest.c
Linking...
   Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp
mytest.obj : error LNK2001: unresolved external symbol _compiler_globals_id
..\..\Debug_TS/php_mytest.dll : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
Creating browse info file...

php_mytest.dll - 2 error(s), 0 warning(s)

登录后复制

?

网上搜索了好久,我试了都不行,所以怀疑是编译器配置的问题,于是打开php_screw和mytest两个工程,对编译参数一项项比对,最后发现:
自动生成的编译参数如下Project --> Setting --> C/C++ -->Preprocessor definitions::
ZEND_DEBUG=1,WIN32,NDEBUG,_WINDOWS,_MBCS,_USRDLL,MYTEST_EXPORTS, COMPILE_DL_MYTEST,ZTS=1,ZEND_WIN32,PHP_WIN32,HAVE_MYTEST=1,LIBZEND_EXPORTS
而php_screw的对应参数则如下:
ZEND_DEBUG=0,WIN32,NDEBUG,_WINDOWS,_MBCS,_USRDLL,SCREW_EXPORTS, COMPILE_DL_SCREW, ZTS=1,ZEND_WIN32,PHP_WIN32,HAVE_SCREW=1
,对比可以发现:
1、自动生成框架的 ZEND_DEBUG=1, 而php_screw的 ZEND_DEBUG=0;
2、自动生成框架的参数中多一个 LIBZEND_EXPORTS ;
我于是对这两个参数分别测试:
1、把 ZEND_DEBUG=1 改成 ZEND_DEBUG=0,再编译,报错如下:

立即学习PHP免费学习笔记(深入)”;

Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'.
--------------------Configuration: mytest - Win32 Debug_TS--------------------
Compiling...
mytest.c
Linking...
   Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp
mytest.obj : error LNK2001: unresolved external symbol _compiler_globals_id
..\..\Debug_TS/php_mytest.dll : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
Creating browse info file...

php_mytest.dll - 2 error(s), 0 warning(s)
登录后复制

?

2、再把 LIBZEND_EXPORTS 去掉,再编译,错误消失:

Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'.
--------------------Configuration: mytest - Win32 Debug_TS--------------------
Compiling...
mytest.c
Linking...
   Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp
Creating browse info file...

php_mytest.dll - 0 error(s), 0 warning(s)
登录后复制

?

3、再把 ZEND_DEBUG=0 重新改成 ZEND_DEBUG=1,再编译,无错:

Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'.
--------------------Configuration: mytest - Win32 Debug_TS--------------------
Compiling...
mytest.c
Linking...
   Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp
Creating browse info file...

php_mytest.dll - 0 error(s), 0 warning(s)
登录后复制

?

所以,问题是由于 LIBZEND_EXPORTS 参数引起的,但由于对VC不熟且对Zend API更面生的缘故,只能是知其然而不可知其所以然也;

相关标签:
php
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号