【发布时间】:2012-04-22 11:48:42
【问题描述】:
我正在尝试编译 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 的线程安全二进制文件以获取 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
但问题是 c:/wamp/bin/php/php5.3.10/ext/imagick.dll' 确实存在,是的,我已经检查过很多次了。
然后我将 ImageMagick 降级到 6.6.2-10-Q16,但仍然看到同样的问题。
同样的问题发生在我的开发机器上,在 Apache 2.2 上运行 nts 版本的 PHP 5.3.10(全部手动安装)。
看起来我对 ZTS 预处理器的看法可能是错误的。如果我设置ZTS=0 并编译,在编译的dll 上使用依赖walker 仍然显示它需要php5ts.dll,这仅存在于PHP 的线程安全版本中。
我对dependency 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
以及来自依赖遍历器的错误:
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编译,但仍然面临同样的问题。
任何提示表示赞赏:)
找到解决方案!看我的回答。
【问题讨论】:
标签: php windows compilation