Blog / 阅读

PHP的ext DLL扩展开发常见错误解决办法留存

by admin on 2014-11-06 13:07:44 in ,



问题:error C2491: “Add” : 不允许 dllimport 函数 的定义  

解决:项目属性 -> C/C++  -> 预处理 -> 预处理器定义 尾部增加 DLL_EXPORT


问题:error C2466: cannot allocate an array of constant size 0

<VS2005安装目录>\VC\include\sys/stat.inl(44) : error C2466: 不能分配常量大小为 0 的数组  

解决:

出现这种情况时,只需在 <VS2005安装目录>\vc\include\malloc.h 文件中找到:

#define _STATIC_ASSERT(expr) typedef char __static_assert_t[ (expr) ]  

并改成:

#ifdef PHP_WIN32  
#define _STATIC_ASSERT(expr) typedef char __static_assert_t[ (expr)?(expr):1 ]  
#else  
#define _STATIC_ASSERT(expr) typedef char __static_assert_t[ (expr) ]  
#endif  

或者
修改php-5.2.9源码包中的
main\config.w32.h
将"#define _USE_32BIT_TIME_T 1"注释
(还未调研此宏的作用,有一定风险)

问题:ostream(967) : error C2491: “std::endl”: 不允许 dllimport 函数 的定义

解决:将 #include <regex> 等 include 语句写到  #include "php.h"上面


其他:

将 .C 文件修改为 .CPP 

将 

#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_xystool.h"

语句用 extern "C"{} 包裹 如下

extern "C"
{
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_xystool.h"
}

ZEND_GET_MODULE(xystool)语句用 extern "C"{} 包裹 如下

extern "C"
{
ZEND_GET_MODULE(xystool)
}

 设置工程属性页中的C++->代码生成->运行库改为多线程DLL(/MD),将C++->高级->编译为改为编译为C代码(/TC),链接器->附加库目录加一项PHP二进制包的dev目录。
    点生成->配置管理器->活动解决方案配置先Release_TS,平台为win32。
处理完这些后,还要修改PHP源码中Zend/Zend.h,将
#include <stdio.h>
移动到
#ifdef ZEND_WIN32
# include "zend_config.w32.h"
# define ZEND_PATHS_SEPARATOR        ';'
#elif defined(NETWARE)
# include <zend_config.h>
# define ZEND_PATHS_SEPARATOR        ';'
#elif defined(__riscos__)
# include <zend_config.h>
# define ZEND_PATHS_SEPARATOR        ';'
#else
# include <zend_config.h>
# define ZEND_PATHS_SEPARATOR        ':'
#endif
的后面去。 还要修改zend_config.w32.h,将
#define vsnprintf _vsnprintf
这行注释掉(否则编译时会提示不能定义大小为0的常量数组和vsnprintf
相关的错误)。



写评论

相关文章

上一篇:在Windows下写PHP的ext DLL扩展例子

下一篇:thinkphp 3.2 写出配置到文件

评论

写评论

* 必填.

分享

栏目

赞助商


热门文章

Tag 云