6

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プリプロセッサ ディレクティブを1orに設定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 を使用してコンパイルしましたが、同じ問題に直面しています。

ヒントをいただければ幸いです:)


解決策が見つかりました! 私の答えを見てください。

4

2 に答える 2

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 バイナリ ツールを入手して、 .xmlに解凍しC:\php-sdkます。

  4. スタートメニューでCMD Shellアンダーを起動して実行します。Microsoft Windows SDK v6.1cd 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. それでは、ビルドしましょう: run cd C:\php-sdk\php53dev\vc9\x86\php5.3-xyzthen buildconfthen 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. このファイルを開き、extensio DLL をextPHP インストールのフォルダーに抽出します。

  19. PHP 拡張機能を有効にして、Web サーバーを再起動します。実行phpinfo()して、拡張機能が有効になっていることを確認します。

  20. 拡張機能が正しく機能しない場合は、必ず再起動してPATH変数を更新してください。私の場合、PATH変数に imagemagick のインストール ディレクトリが必要です。

  21. ???

  22. 利益!

于 2012-04-11T01:45:41.623 に答える
0

コンパイルする必要がある理由はありますか?なぜダウンロードしないのですか?通常、Windows でははるかに簡単/高速です。

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

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

于 2012-04-10T16:22:43.187 に答える