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

我正在尝试编译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 

我只有在linux上编译和编译的东西,所以我不太清楚在Windows环境下如何做到这一点。

我怎样才能编译的扩展,以便它是非线程安全的?


我下载了PHP 5.3.10的threadsafe二进制文件来获取php5ts.lib的副本。 那时我才能编译扩展名。

我猜测,设置ZTS预处理器指令为10将导致扩展编译为线程安全或非线程安全。 (不太清楚这个,所以如果有人能让我知道这是否正确,将不胜感激:))

然后,我build立了一个运行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 

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

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

我的开发机器在Apache 2.2上运行PHP 5.3.10的nts版本(全部手动安装)也发生同样的问题。


看起来我对ZTS预处理器可能是错的。 如果我设置了ZTS=0并编译,在编译后的dll上使用dependency walker仍然显示它只需要php5ts.dll ,它只出现在线程安全版本的PHP上。


我做了更多的修饰与依赖沃克,发现我不得不统计链接到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 

来自依赖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. 

安装了Visual C ++ Express 2008,并使用平台工具包v90进行编译,但仍面临同样的问题。

任何提示赞赏:)


find解决scheme 看到我的答案。

Solutions Collecting From Web of "将PHP扩展编译为非线程安全的"

得到它了! 我希望这可以帮助那些编译未来在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. 在开始菜单中的Microsoft Windows SDK v6.1下启动CMD Shell并运行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. 下载最新版本,并将所有内容提取到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. C:\php-sdk\php53dev\vc9\x86\deps\include目录中的内容从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然后buildconf然后configure --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)应该与pecl-5.3.10-nts-Win32-VC9-x86.zip类似。 打开这个文件,并在您的PHP安装中将extensio DLL提取到您的ext文件夹中。

  19. 启用PHP扩展并重新启动您的网络服务器。 运行phpinfo()并检查是否启用了扩展。

  20. 如果扩展不能正常工作,请确保重新启动以更新PATH变量。 在我的情况下,我需要在我的PATH变量中有imagemagick安装目录。

  21. ???

  22. 利润!

是否有你需要编译的原因? 为什么不下载? 在Windows上通常要简单得多。

VC6: http : //www.sk89q.com/2010/03/vc6-windows-binaries-for-imagick-2-3-0/

VC9: http : //valokuva.org/builds/