ホームページ  >  記事  >  バックエンド開発  >  PHP の C 拡張機能がサードパーティのライブラリを呼び出す方法

PHP の C 拡張機能がサードパーティのライブラリを呼び出す方法

WBOY
WBOYオリジナル
2016-06-23 14:23:491063ブラウズ

私は C で書いているので、この件についてはあまり詳しくありません。まず、プログラムは Linux 上で、PHP のバージョンは 5.3.13 で、C で書いた簡単な追加の PHP 拡張機能が使用できることを説明します。問題は、C ライブラリが C ライブラリに正しくリンクされていないことだと思います: C ライブラリには 2 つのタイプがあります:
1. Linux システム自体に付属していますが、コンパイル時に -l を使用してリンクする必要があります。たとえば、C スレッド ライブラリ -lpthread

2. たとえば、C API 関数 long SetCode( を提供する) の C .so ダイナミック リンク ライブラリ libdecode.so があります。 long l_input);

書き換えます phpで呼び出される関数はこんな感じで書きます

PHP_FUNCTION(php_setcode){long arg_1 = 0;long re = 0;if(zend_parse_parameter(ZEND_NUM_ARGS() TSRMLS_CC, "l", &arg_1) == FAILURE){return;}re = SetCode(arg_1);}

config.m4に追加
PHP_ADD_LIBRARY_WITH_PATH(decode, /home/wzb/lib, TEST_SHARED_LIBADD)
PHP_ADD_INCLUDE(/home/wzb/含む)

コマンド
を実行します。 /configure --with-php-config=/usr/local/php/bin/php-config
make

を作成し、生成された test.so と C サードパーティ ライブラリ libdecode.so をコピーします。 /usr/local /php/lib/php/extension/no-debug-non-zts-20090626
次に、php.ini に次のステートメントを追加しました
extension=test.so
extension=libdecode.so

最後にphp で php_setcode の関数を正常に呼び出すことができません

php_setcode の呼び出しを実現するには、上記の手順をどこに追加する必要があるか教えてください


ディスカッション (解決策) に返信してください


c 処理関数を実装しますか?それとも、単に php がカスタム関数を呼び出すだけですか? もしそうなら、それを php 拡張機能にしたらどうでしょうか: http://blog.csdn.net/franzhong/article/details/7265429

C の処理関数を実装したい、または単に php でカスタム関数を呼び出したいのであれば、それを php 拡張機能にしたらどうでしょうか

前者の場合: http://blog.csdn.net/franzhong/article/details/7265429
つまり、libdecode.so は私が書いたライブラリではなく、サードパーティの C ライブラリによって提供されています。この C ライブラリを呼び出すための PHP 拡張機能を作成する予定です。コンパイルに問題がないことだけです。最後のステップは、このサードパーティ ライブラリをリンクする方法を知ることです。 libdecode.so ライブラリのソース コード .c ファイルがありません

これは、PHP 拡張機能であるかどうかとは関係がありません

C プログラムで接続する方法を知っていればよいだけです

これは、 php の問題については、C /C++ レイアウトにアクセスしてください。そこには多くの専門家がいます


理解できないので、インターネットでチュートリアルを見つけて試してみましょう 原理的な観点から、php にはヘッダーが含まれている必要があります。ファイルを作成し、実行時に、dl シリーズは動的ライブラリにインターフェースを動的にロードする必要があります。動的ライブラリによって公開されるインターフェースは何ですか?

生成したカスタム拡張機能の親ディレクトリに移動します。 ext ディレクトリ。 mysql

#CLEAR

make clean

#Add module ncdocxml

など、拡張機能が実際にどのように実装されているかを見てください。 ./configure --with-php-config=/usr/nc-home/php5/bin/ php-config --enable-ncdocxml

#Compile module ncdocxml
make LDFLAGS=-lncdocxml

これは、php 拡張機能であるかどうかとは関係がありません

C プログラムで接続する方法を知っていればよいだけです

これこれは php の問題ではありません。ヘルプが必要な場合は C/C++ フォーラムにアクセスしてください。そこには多くの専門家がいます

C での動的ライブラリのリンクは、実行可能プログラムが最終的に生成されるときにリンクされます (Windows の .exe に相当)。最終的な実行可能プログラムは C ではなく PHP であるため、.so をリンクする最後のステップは C によって完了されていません


この投稿は、2012-06-07 14:14:13 に xuzuning によって最終的に編集されました
これは静的読み込みであるため、対応する lib ファイルとヘッダー ファイルはありません。静的ロードを実現することは不可能です

必要なのは動的ロードであり、これはもちろん C プログラムで行われます。たとえば、ウィンドウの下の BC には、指定された DLL をロードする LoadLibrary 関数があります。もちろん、ヘッダー ファイルがないとやはり非常に困難です

さらに、vb と vfp では、常に動作中のダイナミック リンク ライブラリを動的にロードしています。スクリプト言語を完成させるためのシステム。完成した作業


参考のためにこのブログ投稿を見つけました。 http://blog.csdn.net/offbye/article/details/6832536

あなたが話しているのは静的読み込みだけですが、対応するlibファイルとヘッダーファイルはありません。静的ロードを実現することは不可能です
必要なのは動的ロードであり、これはもちろん C プログラムで行われます。たとえば、ウィンドウの下の BC には、指定された DLL をロードする LoadLibrary 関数があります。もちろん、ヘッダー ファイルがないとやはり非常に困難です

さらに、vb と vfp では、常に動作中のダイナミック リンク ライブラリを動的にロードしています。完了した作業
もちろん、ヘッダー ファイルは存在します。そうでないと、コンパイルは成功しません。実際、実行可能プログラムを生成するときに、-ldl コンパイル オプションがあります。最終的には、Linux システムに付属するダイナミック ライブラリである .so を PHP にリンクする必要があり、上記の問題を libdecode.so から libdl.so に置き換える必要があります
熱心なご協力ありがとうございます

皆さん、ありがとうございます。問題は解決しました。問題はまだここの config.m4 にあるはずです。解決策は次のとおりです。
vi config.m4
追加
PHP_ADD_LIBRARY_WITH_PATH(decode, /home/wzb/lib, TEST_SHARED_LIBADD)
PHP_ADD_INCLUDE(/home/wzb/include)
PHP_SUBST(TEST_SHARED_LIBADD)

その後、コマンドを順番に実行します
phpize
./configure --enable-test --with-php-config=/usr/local/php/bin/php-config
make

最後に、モジュールで PHP 拡張ライブラリ test.so を取得できます。 libdecode.so の C API 関数の呼び出し

こんにちは、この場所以外で処理を行った場所を聞いてもよろしいでしょうか。同様の問題に遭遇しましたが、現時点では解決する方法がありません。あ

皆さん、ありがとうございます。問題は解決しましたが、問題はまだ config.m4 にあるはずです。解決策は次のとおりです。
vi config.m4
追加
PHP_ADD_LIBRARY_WITH_PATH(decode, /home/wzb/lib, TEST_SHARED_LIBADD)
PHP_ADD_INCLUDE(/home/wzb/include)
PHP_SUBST(TEST_SHARED_LIBADD)

その後、コマンドを順番に実行します
phpize
./configure --enable-test --with-php-config=/usr/local/php/bin/php-config
make

最後に、モジュールで PHP 拡張ライブラリ test.so を取得できます。 libdecode.so の C API 関数の呼び出し

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