使用VC2008来打开mytest.dsp,它提示要转换工程。
然后将mytest.c改名字为mytest.cpp,将里面的
#include “php.h”
#include “php_ini.h”
#include “ext/standard/info.h”
#include “php_mytest.h”
用extern “C”括起来:
extern “C”
{
#include “php.h”
#include “php_ini.h”
#include “ext/standard/info.h”
#include “php_mytest.h”
};
还要将
#ifdef COMPILE_DL_MYTEST
ZEND_GET_MODULE(mytest)
#endif
也括起来
#ifdef COMPILE_DL_MYTEST
extern “C”
{
ZEND_GET_MODULE(mytest)
};
#endif
设置工程属性页中的C++->代码生成->运行库改为多线程DLL(/MD),将C++->高级->编译为改为编译为C++代码(/TP),链接器->附加库目录加一项PHP二进制包的dev目录。
处理完这些后,还要修改PHP源码中Zend/Zend.h,将
#include
移动到
#ifdef ZEND_WIN32
# include “zend_config.w32.h”
# define ZEND_PATHS_SEPARATOR ‘;’
#elif defined(NETWARE)
# include
# define ZEND_PATHS_SEPARATOR ‘;’
#elif defined(__riscos__)
# include
# define ZEND_PATHS_SEPARATOR ‘;’
#else
# include
# define ZEND_PATHS_SEPARATOR ‘:’
#endif
的后面去。 还要修改zend_config.w32.h,将
#define vsnprintf _vsnprintf
这行注释掉,这样就可以正常编译了(按Release_TS编译),在PHP源码目录下的Release_TS目录下生成了 php_mytest.dll,将其拷贝到PHP二进制文件目录下的ext目录中,修改其php.ini文件,加上 extension=php_mytest.dll,在命令行用php -i命令来查看模块是否加载成功了:
mytest
mytest support => enabled
==========================================================
Q1: 如果在编译时遇到这样的警告
warning C4273: “getwchar”: dll 链接不一致
warning C4273: “putwchar”: dll 链接不一致
warning C4005: “_WIN32_WINNT”: 宏重定义
这是因为路径设置的问题,本人对VS2008不太熟悉,在同事帮助下解决这个问题:
设置工程属性页-》链接器-》输入-》附加依赖项 把php5ts.lib设置成绝对路径后,
再编译即可成功!
当.h文件里有函数实现时
VS2008编译器报此错误,解决方法
1.在.h里的函数声明前加 inline
2.在项目->属性->链接器->命令行->附加选项中加 /force