Windows での PHP 拡張機能のコンパイルに関する問題
?
過去 2 日間、特定の関数を実装するために PHP 拡張機能をコンパイルする必要があり、インターネット上の多くの記事を参照し、最終的に 2 つの宝物を見つけました。1 つは php_screw で、もう 1 つは Cygwin です。
まず、知覚的な印象を与えるために php_screw をコンパイルします。コンパイルは問題なく成功しました。次に、それにコードを追加して、最終的にコンパイルが成功しました。しかし、Apacheで試してみたところ、メモリの読み書き例外が頻繁に発生し、修正に時間がかかりましたが、やはり解決できませんでした。
そこで、自分でやり直して、php_screwを参考に少しずつコードを追加して問題が解決できるか確認したいと思います。
オンライン チュートリアルに従って、Cygwin で次のコマンドを使用します:
?php ext_skel_win32.php --extname=mytest
テスト プログラム フレームワークを生成し、フレームワークを直接コンパイルすると、すべてがスムーズに進み、追加します。 Apache でテストすると関数はすべて正常ですが、次の 2 つの関数:
PHP_MINIT_FUNCTION(mytest)
と
PHP_MSHUTDOWN_FUNCTION(mytest)
に関しては、
CG を追加します。戻り SUCCESS (extended_info) = 1;
の前でコンパイルすると、コンパイル エラーが発生します:
Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'. --------------------Configuration: mytest - Win32 Debug_TS-------------------- Compiling... mytest.c Linking... Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp mytest.obj : error LNK2001: unresolved external symbol _compiler_globals_id ..\..\Debug_TS/php_mytest.dll : fatal error LNK1120: 1 unresolved externals Error executing link.exe. Creating browse info file... php_mytest.dll - 2 error(s), 0 warning(s)
?
長い間オンラインで検索しましたが、何も機能しなかったので、コンパイラの設定に問題があるのではないかと思い、php_screw プロジェクトと mytest プロジェクトを開いてコンパイルパラメータを 1 つずつ比較し、最終的に次のことを見つけました。
自動生成 コンパイルパラメータは次のとおりですプロジェクト -->C/C++ -->プリプロセッサ定義::
ZEND_DEBUG=1、WIN32,NDEBUG,_WINDOWS,_MBCS,_USRDLL,MYTEST_EXPORTS, COMPILE_DL_MYTEST,ZTS=1,ZEND_WIN32,PHP_WIN32,HAVE_MYTEST=1,LIBZEND_EXPORTS
対応するパラメータphp_screw の内容は次のとおりです:
ZEND_DEBUG=0,WIN32,NDEBUG,_WINDOWS,_MBCS,_USRDLL,SCREW_EXPORTS, COMPILE_DL_SCREW, ZTS=1,ZEND_WIN32,PHP_WIN32,HAVE_SCREW=1
、比較は次のとおりです:
1. フレームワーク =1 を自動的に生成する ZEND_DEBUG、および php_screw の ZEND_DEBUG=0;
2. 自動的に生成されたフレームワークのパラメーターにはもう 1 つの LIBZEND_EXPORTS があります。
次に、これら 2 つのパラメーターを個別にテストしました。
1. ZEND_DEBUG=1 を ZEND_DEBUG =0 に変更し、再度コンパイルすると、次のようなエラーが表示されます:
Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'. --------------------Configuration: mytest - Win32 Debug_TS-------------------- Compiling... mytest.c Linking... Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp mytest.obj : error LNK2001: unresolved external symbol _compiler_globals_id ..\..\Debug_TS/php_mytest.dll : fatal error LNK1120: 1 unresolved externals Error executing link.exe. Creating browse info file... php_mytest.dll - 2 error(s), 0 warning(s)
?
2. LIBZEND_EXPORTS を削除し、再度コンパイルすると、エラーは消えます。
Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'. --------------------Configuration: mytest - Win32 Debug_TS-------------------- Compiling... mytest.c Linking... Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp Creating browse info file... php_mytest.dll - 0 error(s), 0 warning(s)?
3. ZEND_DEBUG=0 を ZEND_DEBUG=1 に変更し、再度コンパイルします。エラーは発生しません。
Deleting intermediate files and output files for project 'mytest - Win32 Debug_TS'. --------------------Configuration: mytest - Win32 Debug_TS-------------------- Compiling... mytest.c Linking... Creating library Debug_TS/php_mytest.lib and object Debug_TS/php_mytest.exp Creating browse info file... php_mytest.dll - 0 error(s), 0 warning(s)?
つまり、問題は LIBZEND_EXPORTS パラメータによって引き起こされますが、私は VC に詳しくなく、Zend API にも詳しくないため、それを知ることはできても、その理由はわかりません。