我正在尝试编译 imagemagick (imagick) 扩展以在 Windows 上的非线程安全环境中使用。
我正在使用 PHP 5.3.10 并设置了 Visual C++ express 作为我的编译环境。问题是我在 Apache 2.2 中使用 PHP 的非线程安全版本作为 FCGI 模块。
因此,我的 PHP 提供了 aphp5.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
以及依赖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编译,但仍然面临同样的问题。
任何提示表示赞赏:)