Windows の非スレッドセーフ環境で使用する imagemagick (imagick) 拡張機能をコンパイルしようとしています。
PHP 5.3.10 を使用しており、コンパイル環境として Visual C++ Express をセットアップしました。問題は、スレッドセーフでないバージョンの PHP を Apache 2.2 の FCGI モジュールとして使用していることです。
php5.lib
したがって、私の PHP には ではなくが付属してい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
orに設定0
すると、拡張機能がスレッドセーフまたは非スレッドセーフとしてコンパイルされると推測しています。(これについてはよくわからないので、誰かがこれが正しいかどうかを教えてくれれば幸いです. :) )
次に、Windows 7 を実行する仮想マシンをセットアップし、最新バージョンの WAMP をインストールしました。その理由は、スレッドセーフ バージョンの PHP を使用していたためです。
PHP インストールの ext フォルダーに dll を配置し、.NET で有効にしました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 で依存関係ウォーカーを使用しても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
そして、依存関係ウォーカーからのエラー:
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 を使用してコンパイルしましたが、同じ問題に直面しています。
ヒントをいただければ幸いです:)