免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2113 | 回复: 1
打印 上一主题 下一主题

在Windows上编译PHP扩展组件的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-04 17:39 |只看该作者 |倒序浏览
在Windows上编译PHP扩展组件的问题





这两天需要编译一个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;
,然后再编译,则出现了编译错误:

Cpp代码
  1. 1.Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'.   
  2. 2.--------------------Configuration: mytest - Win32 Debug_TS--------------------   
  3. 3.Compiling...   
  4. 4.mytest.c   
  5. 5.Linking...   
  6. 6.   Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp   
  7. 7.mytest.obj : error LNK2001: unresolved external symbol _compiler_globals_id   
  8. 8...\..\Debug_TS/php_mytest.dll : fatal error LNK1120: 1 unresolved externals   
  9. 9.Error executing link.exe.   
  10. 10.Creating browse info file...   
  11. 11.  
  12. 12.php_mytest.dll - 2 error(s), 0 warning(s)  
  13. Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'.
  14. --------------------Configuration: mytest - Win32 Debug_TS--------------------
  15. Compiling...
  16. mytest.c
  17. Linking...
  18.    Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp
  19. mytest.obj : error LNK2001: unresolved external symbol _compiler_globals_id
  20. ..\..\Debug_TS/php_mytest.dll : fatal error LNK1120: 1 unresolved externals
  21. Error executing link.exe.
  22. Creating browse info file...

  23. php_mytest.dll - 2 error(s), 0 warning(s)
复制代码
网上搜索了好久,我试了都不行,所以怀疑是编译器配置的问题,于是打开php_screw和mytest两个工程,对编译参数一项项比对,最后发现:
  1. 自动生成的编译参数如下Project --> Setting --> C/C++ -->Preprocessor definitions::
  2. ZEND_DEBUG=1,WIN32,NDEBUG,_WINDOWS,_MBCS,_USRDLL,MYTEST_EXPORTS, COMPILE_DL_MYTEST,ZTS=1,ZEND_WIN32,PHP_WIN32,HAVE_MYTEST=1,LIBZEND_EXPORTS
  3. 而php_screw的对应参数则如下:
  4. 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,再编译,报错如下:

Cpp代码
  1. 1.Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'.   
  2. 2.--------------------Configuration: mytest - Win32 Debug_TS--------------------   
  3. 3.Compiling...   
  4. 4.mytest.c   
  5. 5.Linking...   
  6. 6.   Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp   
  7. 7.mytest.obj : error LNK2001: unresolved external symbol _compiler_globals_id   
  8. 8...\..\Debug_TS/php_mytest.dll : fatal error LNK1120: 1 unresolved externals   
  9. 9.Error executing link.exe.   
  10. 10.Creating browse info file...   
  11. 11.  
  12. 12.php_mytest.dll - 2 error(s), 0 warning(s)  
  13. Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'.
  14. --------------------Configuration: mytest - Win32 Debug_TS--------------------
  15. Compiling...
  16. mytest.c
  17. Linking...
  18.    Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp
  19. mytest.obj : error LNK2001: unresolved external symbol _compiler_globals_id
  20. ..\..\Debug_TS/php_mytest.dll : fatal error LNK1120: 1 unresolved externals
  21. Error executing link.exe.
  22. Creating browse info file...

  23. php_mytest.dll - 2 error(s), 0 warning(s)
复制代码
2、再把 LIBZEND_EXPORTS 去掉,再编译,错误消失:

Cpp代码
  1. 1.Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'.   
  2. 2.--------------------Configuration: mytest - Win32 Debug_TS--------------------   
  3. 3.Compiling...   
  4. 4.mytest.c   
  5. 5.Linking...   
  6. 6.   Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp   
  7. 7.Creating browse info file...   
  8. 8.  
  9. 9.php_mytest.dll - 0 error(s), 0 warning(s)  
  10. Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'.
  11. --------------------Configuration: mytest - Win32 Debug_TS--------------------
  12. Compiling...
  13. mytest.c
  14. Linking...
  15.    Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp
  16. Creating browse info file...

  17. php_mytest.dll - 0 error(s), 0 warning(s)
复制代码
3、再把 ZEND_DEBUG=0 重新改成 ZEND_DEBUG=1,再编译,无错:

Cpp代码
  1. 1.Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'.   
  2. 2.--------------------Configuration: mytest - Win32 Debug_TS--------------------   
  3. 3.Compiling...   
  4. 4.mytest.c   
  5. 5.Linking...   
  6. 6.   Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp   
  7. 7.Creating browse info file...   
  8. 8.  
  9. 9.php_mytest.dll - 0 error(s), 0 warning(s)  
  10. Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'.
  11. --------------------Configuration: mytest - Win32 Debug_TS--------------------
  12. Compiling...
  13. mytest.c
  14. Linking...
  15.    Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp
  16. Creating browse info file...

  17. php_mytest.dll - 0 error(s), 0 warning(s)
复制代码
所以,问题是由于 LIBZEND_EXPORTS 参数引起的,但由于对VC不熟且对Zend API更面生的缘故,只能是知其然而不可知其所以然也;

论坛徽章:
0
2 [报告]
发表于 2011-11-05 02:48 |只看该作者
哇  楼主 强大啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP