【问题标题】:Compiling a php extension with Visual Studio 2008, MODULE ID don't match with php使用 Visual Studio 2008 编译 php 扩展,MODULE ID 与 php 不匹配
【发布时间】:2011-04-08 04:35:38
【问题描述】:

使用 VC9 (2008) 和 VC10 (2010) 编译我自己的 php 扩展后,使用以下步骤:

http://blog.slickedit.com/2007/09/creating-a-php-5-extension-with-visual-c-2005/

初始化php时出现下一个错误:

PHP Warning:  PHP Startup: FirstPHPExt Module: Unable to initialize module
Module compiled with build ID=API20090626,TS
PHP    compiled with build ID=API20090626,TS,VC9
These options need to match
 in Unknown on line 0

为什么没有说我用VC9编译了模块?

更多信息:

操作系统:Windows7 x64 PHP: 5.3.3,TS,VC9

【问题讨论】:

    标签: php php-extension pecl visual-c++-2008


    【解决方案1】:

    并且强烈建议使用与php本身相同的CRT(VC9)。在 apache、php 或其扩展之间使用混合 CRT 时存在已知问题。

    【讨论】:

    • 确实如此,但是在VS2010下可以链接到vc9 crt。值得一试
    • 它只是一个 UI 选项还是有一些链接器选项可以做到这一点?我找不到关于 vc10 的可能标志的文档以链接到 vc9 crt。
    • 进入你项目的“Properties”,“Configuration properties”,General,你必须更改“Platform Toolset”
    【解决方案2】:

    构建PHP和扩展的官方文档在wiki

    您应该为您的扩展创建一个config.w32 文件并通过命令行构建它。这是官方支持的方法。

    【讨论】:

      【解决方案3】:

      好的,我找到了解决方案:

      您必须在 php-src/Zend/zend_build.h 中添加一个预处理器常量:

      #define PHP_COMPILER_ID "VC9"
      

      它会起作用的。


      在这里找到解决方案:http://forums.zend.com/viewtopic.php?f=55&t=2045

      【讨论】:

      • 在您的情况下,它是编译器版本,但请注意,有时构建 ID 的其他部分之一可能是问题所在。如果 API 不同,那么您是针对另一个(不兼容的)PHP 版本编译的,而不是您将扩展部署到的版本。最后,如果 TS/NTS 不匹配,那么您需要在扩展项目中定义或取消定义 ZTS 预处理器定义以匹配 PHP。 (TS=线程安全,NTS=非线程安全)。
      猜你喜欢
      • 2011-06-21
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 2016-03-22
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多