将PHP扩展编译为非线程安全的

F21*_*F21 6 php windows compilation

我正在尝试编译imagemagick(imagick)扩展,以便在Windows上的非线程安全环境中使用.

我使用的是PHP 5.3.10,并将Visual C++ express设置为我的编译环境.问题是我在Apache 2.2中使用非线程安全的PHP版本作为FCGI模块.

因此,我的PHP提供了一个php5.lib而不是一个php5ts.lib.我相信这就是我收到这些错误的原因:

imagick.obj : error LNK2019: unresolved external symbol __imp__tsrm_mutex_alloc referenced in function _zm_startup_imagick
Run Code Online (Sandbox Code Playgroud)

我只在linux上构建和编译过东西,所以我不太确定如何在windows环境下执行此操作.

如何编译扩展以使其不是线程安全的?


我下载了PHP 5.3.10的threadsafe二进制文件来获取php5ts.lib的副本.然后我就可以编译扩展了.

我猜测将ZTS预处理程序指令设置为1或者0将导致扩展编译为线程安全或非线程安全.(对此不太确定,所以如果有人能告诉我这是否正确,那将非常感激.:))

然后我设置了一个运行Windows 7的虚拟机并安装了最新版本的WAMP.原因是它使用了PHP的线程安全版本.

我将dll放在PHP安装的ext文件夹中并启用它php.ini.但是,即使在WAMP中尝试了ts和nts版本之后,我也会得到:

PHP Warning:  PHP Startup: Unable to load dynamic library 'c:/wamp/bin/php/php5.3.10/ext/imagick.dll' - The specified module could not be found.
 in Unknown on line 0
Run Code Online (Sandbox Code Playgroud)

但问题c:/wamp/bin/php/php5.3.10/ext/imagick.dll'确实存在,是的,我已经检查了很多次.

然后我将ImageMagick降级到6.6.2-10-Q16,但仍然看到同样的问题.

在Apache 2.2上运行nts版本的PHP 5.3.10的dev机器上也会出现同样的问题(全部手动安装).


看起来我对ZTS预处理器可能是错的.如果我设置ZTS=0和编译,在编译的dll上使用依赖walker仍然表明它需要php5ts.dll哪个只存在于线程安全的PHP版本上.


我做了更多修补依赖性walker,发现我必须统计链接到msvc100d.dll.然后我ZTS在预处理器定义中删除了并且能够使用php5.lib而不是编译php5ts.dll.我认为这应该让我得到一个非ts dll.

但是,加载扩展程序时,我仍然得到:

PHP Warning:  PHP Startup: Invalid library (maybe not a PHP library) 'imagick.dll' in Unknown on line 0
Run Code Online (Sandbox Code Playgroud)

来自依赖者walker的错误:

Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module.
Error: Modules with different CPU types were found.
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.
Run Code Online (Sandbox Code Playgroud)

安装了visual c ++ express 2008并使用平台工具包v90编译,但仍面临同样的问题.

任何提示赞赏:)


解决方案!看我的回答.

F21*_*F21 6

得到它了!我希望这可以帮助那些将来在windows上编译php扩展的人.我所做的是基于:https://wiki.php.net/internals/windows/stepbystepbuild

注意:我在这个网站上读到一个答案,说不支持在Windows上自行编译PHP扩展.基于我昨天的实验,它似乎也是很多工作,所以我使用PHP构建过程.

最好的方法是使用PHP构建过程.

  1. 安装Visual C++ Express 2008(任何版本都可以,但是express是免费的)和Windows SDK 6.1(注意我们希望6.1版本不是更旧或更新版本).

  2. 如果尚未安装SVN客户端工具,请重新启动以使PATH变量生效.

  3. 获取PHP SDK二进制工具并将其解压缩到C:\php-sdk.

  4. 启动CMD Shell下,Microsoft Windows SDK v6.1在开始菜单和运行cd C:\php-sdk.

  5. 运行setenv /x86 /xp /release此命令会创建一个32位版本.您可以使用/x64构建64位版本(我没有尝试过这个).

  6. bin\phpsdk_setvars.bat

  7. bin\phpsdk_buildtree.bat php53dev

  8. 下载PHP源代码并将其解压缩到C:\php-sdk\php53dev\vc9\x86最终结果C:\php-sdk\php53dev\vc9\x86\php5.3-xyz

  9. 下载最新的deps并将所有内容解压缩到C:\php-sdk\php53dev\vc9\x86.系统可能会提示您覆盖任何现有文件夹,因此请按"是".

  10. cd C:\php-sdk\php53dev\vc9\x86

  11. 从svn存储库中查看最新版本的扩展:svn co http://svn.php.net/repository/pecl/imagick/trunk pecl/imagick我在这里查看imagick.

  12. 安装任何依赖项.在我的情况下,我需要安装ImageMagick,所以我下载了最新推荐的Windows二进制文件.您需要在安装后重新启动才能更新PATH变量,但是您可以在编译后执行此操作.确保安装C/C++标头并包含.

  13. includes目录的内容从ImageMagick安装目录复制到C:\php-sdk\php53dev\vc9\x86\deps\include.

  14. lib目录的内容从ImageMagick安装目录复制到C:\php-sdk\php53dev\vc9\x86\deps\lib

  15. 现在,让我们来构建:运行cd C:\php-sdk\php53dev\vc9\x86\php5.3-xyz,然后buildconfconfigure --help.正确看待帮助.它将显示所有配置标志和启用的任何可用扩展.在我的情况下,因为我添加了imagick,我有一个叫做的选项--with-imagick

  16. 运行config:configure --enable-cli --with-imagick=shared --disable-zts如果要构建非线程安全的二进制使用--disable-zts,否则删除该配置标志.我不知道为什么,但有时扩展使用--with-myextension标志,有时--enable-myextension,所以检查configure --help要使用的标志.如果=shared在扩展标志之后添加,它将被编译为单独的DLL,这就是我们想要的.

  17. 编译:nmake然后运行nmake snap.

  18. 完成:)检查C:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release(非线程安全)或C:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release_TS(线程安全).你编译的二进制文件应该在那里.已编译的扩展(pecl)应该与ZIP文件类似pecl-5.3.10-nts-Win32-VC9-x86.zip.打开此文件并将extensio DLL解压缩到extPHP安装中的文件夹中.

  19. 启用PHP扩展并重新启动Web服务器.运行phpinfo()并检查扩展是否已启用.

  20. 如果扩展程序无法正常运行,请确保重新启动以更新PATH变量.在我的情况下,我需要在我的PATH变量中有imagemagick安装目录.

  21. ???

  22. 利润!