php呼叫c語言編寫的so動態庫

2021-09-08 09:24:18 字數 2829 閱讀 1578

php除了使用擴充套件庫的方式呼叫c函式,還可以通過socket通訊的方式。這裡介紹前者。1. 先看本機是否已經安裝了較低版本的php #find /usr -name "php" 或者rpm -aq | grep php 如果存在,就使用rpm命令等方式卸掉 2. php原始碼安裝,configure的引數如下 #./configure  --prefix=/usr/local/php   --with-mysql --with-mysqli  --enable-so  --with-pdo-mysq=/var/lib/mysql  --with-apxs2=/usr/local/apache/bin/apxs --with-zlib --enable-zip --enable-mbstring 3. 如果已經安裝了兩個版本的php,使用apache函式,確定使用的是哪個版本的php

[html] <?php echo "hello world"; phpinfo(); ?>

[/html]

4. 如果已經安裝了兩個版本的php,使用php檢視版本號或確定php.ini的配置檔案 #/usr/local/php/bin/php -v #/usr/local/php/bin/php -i | grep php.ini[cpp] #vim hello.c int cc_add(int a, int b) # gcc -o -c -fpic -o hello.o hello.c      // -fpic:是指生成的動態庫與位置無關 # gcc -shared -o libhello.so hello.o      // -shared:是指明生成動態鏈結庫 # cp libhello.so /usr/local/lib      // 把生成的鏈結庫放到指定的位址 # echo /usr/local/lib > /etc/ld.so.conf.d/local.conf  //把庫位址寫入到配置檔案中 # /sbin/ldconfig                //用此命令,使剛才寫的配置檔案生效 [/cpp]

以下是測試so檔案

[cpp] #include int main() #gcc -o hellotest -lhello hellotest.c  //編譯測試檔案,生成測試程式 #./hellotest           //執行測試程式 [/cpp]

1. 然後通過下面的命令用ext_skel指令碼建立乙個名為 hello 的模組: #cd php-5.3.6/ext #./ext_skel --extname=hello 2. 執行該命令之後它會提示你應當用什麼命令來編譯模組,可惜那是將模組整合到php內部的編譯方法。 如果要編譯成可動態載入的 php_hello.so,方法要更為簡單。 #cd hello 首先編輯 config.m4 檔案,去掉注釋(注釋符號為 dnl 。) # vim config.m4 php_arg_enable(hello, whether to enable hello support, dnl make sure that the comment is aligned: [  --enable-hello           enable hello support]) 3. 然後執行 phpize 程式,生成configure指令碼: #phpize 4. 開啟 php_hello.h,在 php_function(confirm_hello_compiled); 之下加入函式宣告: php_function(confirm_hello_compiled);   /* for testing, remove later. */ php_function(hello_add); 5. 開啟 hello.c,在 php_fe(confirm_hello_compiled, null) 下方加入以下內容。

[php] zend_function_entry hello_functions =   /* must be the last line in hello_functions */}; 然後在 hello.c 的最末尾書寫hello_add函式的內容: php_function(hello_add) result = cc_add(a, b); return_long(result); } [/php]

6.配置安裝 #./configure --with-php-config=/usr/local/php/bin/php-config #make ldflags=-lhello #make install installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/ #cp modules/hello.so /usr/lib/php/modules #vim /etc/php5/apache2/php.ini enable_dl = off; //允許dl()動態載入so擴充套件功能enable_dl = on # /etc/init.d/httpd restart 然後在 /var/www/html 下建立乙個 hello.php 檔案,內容如下:

[html] <?php dl("hello.so"); echo hello_add(4, 6); ?>

[/html]

然後在瀏覽器中開啟hello.php檔案,如果顯示10,則說明函式呼叫成功了。另外可以在apache重啟的時候讓我們的so庫直接動態編譯進php5,就像linux的insmod hello.ko模組一樣,不用dl載入也不用重新編譯php,就可以直接使用so的函式了,步驟如下: # vim /etc/php5/apache2/php.ini enable_dl = off extension=hello.so # /etc/init.d/httpd restart [注意,這種方式只適合hello.so庫內所有功能**已經全部除錯ok,如果還處在除錯期間,那麼需要採用上面的dl強制載入的方式]

[html] **如下: <?php echo hello_add(4, 6); ?>

[/html]

php呼叫c語言編寫的so動態庫

php除了使用擴充套件庫的方式呼叫c函式,還可以通過socket通訊的方式。這裡介紹前者。1.先看本機是否已經安裝了較低版本的php find usr name php 或者rpm aq grep php 如果存在,就使用rpm命令等方式卸掉 2.php原始碼安裝,configure的引數如下 co...

c語言呼叫c語言的so動態庫

1.環境 ubuntu14.o4 gcc 4.8.4 2.庫檔案生成 1 原始碼 int add int a,int b 2 生成庫檔案 cd到cltest.c所在目錄,輸入命令 gcc shared o libcltest.so cltest.c會在當前目錄生成檔案libcltest.so 3.主...

c 呼叫c 的so動態庫2

1.環境 ubuntu 14.04 g 4.8.4 2.有類的情況 1 庫檔案 a 原始碼 class cal typedef cal creat t typedef void destroy t cal include cppl2.h cal cal cal cal int cal add int...