如何使用 Microsoft Visual C++ 2008 编译 PHP 扩展?

Posted

技术标签:

【中文标题】如何使用 Microsoft Visual C++ 2008 编译 PHP 扩展?【英文标题】:How do I compile a PHP extension with Microsoft Visual C++ 2008? 【发布时间】:2011-06-21 22:03:36 【问题描述】:

我使用 Microsoft Visual C++ 2008 创建了一个 php Hello World 扩展 DLL。我拥有正确的 php.ini(我知道,因为当我启用和禁用 gd2 扩展时,会有 效果) ,但是当我加载扩展时,它不会在phpinfo() 的附加模块下弹出。

当我尝试测试函数(一个简单的double() 函数)时,它显然不起作用。我用this tutorial)。

如果有人可以提供他们在执行此操作时创建的 dll(以查看我的是否搞砸了或者它是否是我的服务器),那么我很乐意对其进行测试。

系统规格

操作系统:Windows (Vista) 服务器:WAMP PHP:5.3.5(Xampp 和 IIS 也安装了)

当我运行命令 php --ini 时,我收到此错误:

PHP Startup: TalkPHP Extension: Unable to initalize module
Module compiled with build ID=API20090626, TS, VC9.
PHP   compiled with build IF=API20090626, TS, VC6.
These options need to match

这是否意味着我必须使用版本 9 来编译 PHP?

【问题讨论】:

你的操作系统和网络服务器是什么? 你重启了吗?您是否尝试通过 dl("yourext.dll"); 加载它? 由于某种原因,当我启用 dl() 时,它说它已在 phpinfo() 中启用,但说它是我程序上未定义的函数 dl() 可能已添加到 disabled_functions 指令中。 @Orbling 很抱歉,这里已经很晚了(凌晨 3:30)。这是问题的正确链接:***.com/questions/3641751/… 【参考方案1】:

VC9 和 VC6 版本不兼容。您要么必须使用 VC6 编译 DLL,要么从他们的 download page 获取使用 VC9 编译的 PHP 二进制文件。

如果您使用 Apache 和 mod_php,您还需要一个 VC9 版本的 Apache 来加载 VC9 PHP,您可以从 apachehaus.com 获得这些。

【讨论】:

【参考方案2】:

来自 cmets 的解决方案...

-我找到了解决方案forums.zend.com/viewtopic.php?f=55&t=2045

-可能重复:问题:***.com/questions/3641751/

我收到这些警告

c:\wamp\bin\php\php-5.3.5src\zend\zend_build.h(19) : warning C4005: 'PHP_COMPILER_ID': macro redefinition c:\wamp\bin\php\php-5.3.5src\main\config.w32.h(189) : see previous definition of 'PHP_COMPILER_ID' 1>
c:\wamp\bin\php\php-5.3.5src\main\config.w32.h(189) : warning C4005: 'PHP_COMPILER_ID' : macro redefinition 1> 
c:\wamp\bin\php\php-5.3.5src\zend\zend_build.h(19) : see previous definition of'PHP_COMPILER_ID'

我认为这与我的实际说是用 VC9 编译的事实有关,而在其他方面它什么都没有。 (它们是警告,但我认为这就是它不起作用的原因)

好的,什么也没做,只是尝试了一下,但是当我运行扩展程序时,它工作了。我仍然从 php --ini 收到错误,但它运行并正常工作。

【讨论】:

【参考方案3】:

我成功编译并运行了一个自定义 php 扩展。

您可以尝试以下方法吗:

从 php-5.3.5 获取 vc9 构建 不要在 zend_build.h 头文件中#define PHP_COMPILER_ID(恕我直言,无论如何这都是个坏主意) 您可能也在 config.w32.h 中定义了 PHP_COMPILER_ID;删除它 在您的项目设置(C/C++ - 预处理器)中定义:PHP_COMPILER_ID=\"VC9\" (如果您需要 php 的 vc6 构建,那么我会尝试定义 PHP_COMPILER_ID=\"VC6\";我不知道这是否可以正常工作,但我使用了星座 [php-5.2.x vc6,自定义 php用 vc9 编译的扩展] 没有问题,永远)

【讨论】:

以上是关于如何使用 Microsoft Visual C++ 2008 编译 PHP 扩展?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中使用 Microsoft Visual Studio 2012 查找语法错误?

如何使用 Microsoft Visual C++ 调试器调试 MinGW EXE?

Microsoft Visual Studio C++、OpenCV 动画

如何在 Microsoft Visual C++ Express 中运行 C++ 简单代码 [关闭]

我无法在 Windows 上安装 pyaudio?如何解决“错误:需要 Microsoft Visual C++ 14.0。”?

需要 Microsoft Visual C++ 14.0。使用“Microsoft Visual C++ 构建工具”获取它:http://landinghub.visualstudio.com/vis