ホームページ  >  記事  >  バックエンド開発  >  Windows での PHP 拡張コンポーネントのコンパイルに関連する問題

Windows での PHP 拡張コンポーネントのコンパイルに関連する問題

WBOY
WBOYオリジナル
2016-06-13 13:25:59854ブラウズ

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 にも詳しくないため、それを知ることはできても、その理由はわかりません。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。