`

在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;
,然后再编译,则出现了编译错误:

Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'.
--------------------Configuration: mytest - Win32 Debug_TS--------------------
Compiling...
mytest.c
Linking...
   Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp
mytest.obj : error LNK2001: unresolved external symbol _compiler_globals_id
..\..\Debug_TS/php_mytest.dll : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
Creating browse info file...

php_mytest.dll - 2 error(s), 0 warning(s)

 

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

Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'.
--------------------Configuration: mytest - Win32 Debug_TS--------------------
Compiling...
mytest.c
Linking...
   Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp
mytest.obj : error LNK2001: unresolved external symbol _compiler_globals_id
..\..\Debug_TS/php_mytest.dll : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
Creating browse info file...

php_mytest.dll - 2 error(s), 0 warning(s)

 

2、再把 LIBZEND_EXPORTS 去掉,再编译,错误消失:

Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'.
--------------------Configuration: mytest - Win32 Debug_TS--------------------
Compiling...
mytest.c
Linking...
   Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp
Creating browse info file...

php_mytest.dll - 0 error(s), 0 warning(s)

 

3、再把 ZEND_DEBUG=0 重新改成 ZEND_DEBUG=1,再编译,无错:

Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'.
--------------------Configuration: mytest - Win32 Debug_TS--------------------
Compiling...
mytest.c
Linking...
   Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp
Creating browse info file...

php_mytest.dll - 0 error(s), 0 warning(s)

 

所以,问题是由于 LIBZEND_EXPORTS 参数引起的,但由于对VC不熟且对Zend API更面生的缘故,只能是知其然而不可知其所以然也;

分享到:
评论

相关推荐

    php8.1和php8.2和swow扩展windows版本

    总结起来,要在Windows上实现PHP 8.1或8.2与Swoole扩展的结合,并利用Hyperf框架,你需要: 1. 安装匹配版本的PHP 8.x。 2. 下载并安装Swoole扩展。 3. 使用Composer安装Hyperf框架。 4. 根据需求配置项目和系统环境...

    php curl安装 php中没有编译curl的解决方法for windows

    除了手动安装,你还可以使用一些集成开发环境(IDE)或Web服务器软件的管理界面来添加和管理PHP扩展,如XAMPP控制面板中的“PHP Extensions”选项。这种方法通常更简单,但可能不适用于所有情况。 总之,为Windows...

    PHP7.2.6安装sodium扩展

    在 PHP 开发中,sodium 扩展是一个非常重要的组件,它提供了高级的加密和解密功能。在 PHP7.2.6 中,安装 sodium 扩展需要先安装 libsodium 依赖项,并且需要编译 PHP 源代码来生成 sodium 扩展模块。 首先,需要...

    php扩展开发编译过程解析

    PHP扩展通常位于PHP的ZEND层,即在PHP虚拟机执行层之上,它们可以直接操作ZEND_opcodes,提供新的数据类型、函数和类。扩展可以增加性能,因为它们直接在C级别运行,避免了PHP解释器的额外开销。 2.3 PHP扩展的方式...

    PHP 扩展说明与需要的文件

    2. **Cygwin-setup-x86.exe**:Cygwin是一个提供Linux环境的工具,用于在Windows系统上运行,对于在Windows上编译PHP扩展非常有用。安装Cygwin后,你可以获取GCC编译器和其他必需的开发工具,以便编译源代码形式的...

    ZBarCodeImage php window扩展包

    PHP扩展安装与配置 在Windows环境下,安装ZBarCodeImage扩展通常需要以下步骤: - 下载预编译的二进制扩展文件(如:zbarcodeimage.dll)。 - 将该文件复制到PHP的`ext`目录下。 - 修改php.ini文件,添加`...

    RabbitMQ 的windows php 扩展php_amqp-1.2.0-5.3-nts-vc9-x86.dll

    `php_amqp`扩展为Windows上的PHP开发者提供了与RabbitMQ集成的途径,允许他们在PHP应用中充分利用消息队列的优点,如异步处理、解耦和容错。确保正确选择与PHP环境匹配的扩展版本,并正确安装和配置,是成功使用的...

    php5.6下的redis扩展(redis/php_redis.dll/php_igbinary.dll)windows环境

    本资源合集专注于PHP 5.6版本在Windows NTX操作系统上的配置,提供了必要的组件来实现这一目标。 首先,Redis-x64-2.8.2104.zip是Redis服务器的二进制版本,适用于64位操作系统。安装Redis时,你需要解压此文件到一...

    PHP扩展 SG11下载

    文件,找到`extension=...`行,添加`extension=sg11.so`(在Linux上)或`extension=php_sg11.dll`(在Windows上)。 4. 保存配置并重启PHP服务,使更改生效。 在使用SG11扩展前,建议先阅读官方文档或相关教程,...

    protobuf for windows php

    在Windows上安装和配置protobuf扩展可能会有一些特殊步骤,比如需要正确配置系统路径,安装Visual C++ Redistributable,以及确保PHP的扩展目录包含正确编译的二进制文件。 在提供的压缩包子文件"php_protobuf.dll"...

    windows php7.4 php-apcu.dll

    在Windows上配置PHP环境时,安装并启用APCu扩展是非常重要的一步,因为这能够缓存编译后的PHP代码,减少每次请求时的解析时间,从而提高整体性能。`php_apcu.dll`是APCu扩展在Windows环境下运行所需的核心组件,它...

    php7及以上版本 swoole扩展

    Swoole是一个高性能的PHP扩展,专为网络并发设计,提供了异步多线程服务器、异步TCP/UDP网络客户端、HTTP服务器、WebSocket服务器、MySQL协议服务器等功能。它极大地提升了PHP处理高并发、长连接场景下的性能,使得...

    PHP swoole loader 扩展 for linux win系统、线程安全\非安全、PHP54-81 全集

    首先,确保你的系统满足编译PHP扩展所需的依赖,如`php-dev`、`zlib-dev`等。运行脚本并指定你的PHP版本和线程安全性,例如: ```bash ./swoole-compiler-loader.sh --php-version=7.4 --thread-safe ``` 安装完成...

    php7 memcache扩展

    不同版本的编译器可能导致PHP与某些特定的库或组件兼容性问题,因此在选择合适的PHP版本时,需要确保其与所使用的其他软件(如Apache、Nginx等)的编译器版本匹配。 4. Windows(x86/x64): x86和x64分别代表32位...

    php7的sphinx扩展,适用linux,mac

    3. 在编译PHP7的Sphinx扩展时,确保指定了正确的libsphinxclient路径,如`--with-sphinxclient=/path/to/libsphinxclient`。 总结,PHP7的Sphinx扩展是实现高效全文搜索的关键组件,尤其在处理大量数据和中文文本时...

    CentOs下安装PHP扩展 curl

    为了编译PHP扩展,我们需要php-devel包: ``` sudo yum install php-devel ``` 5. **下载PHP cURL扩展** 下载PHP的cURL扩展源代码。你可以从PHP官方网站获取最新的版本,或者使用wget命令直接下载: ``` ...

    php5.6关于redis在windows下的包

    标题 "php5.6关于redis在windows下的包" 指的是在Windows操作系统上使用PHP 5.6版本与Redis数据库交互的一种扩展包。Redis是一个高性能的键值存储系统,常用于缓存、消息队列等场景。在Windows环境下,由于PHP原生不...

    Ubuntu编译安装php7

    在执行上述命令时,可能会遇到一些错误提示,例如找不到必要的头文件或库文件,此时可以通过安装相应的开发包来解决这些问题,例如: ```bash sudo apt-get install libxml2 libxml2-dev sudo apt-get install ...

Global site tag (gtag.js) - Google Analytics