Ubuntu 下php调用c语言.so文件
2016-12-02 16:06
363 查看
写一个php模块(php extension),在php中调用该模块内的函数,再通过该模块来调用so中的函数。
首先做一个简单的so文件:
然后将它编译成.so文件并放到系统中:
写段小程序来验证其正确性:
编译并执行:
经测试。在Ubuntu上无法通过编译,在Centos下正常编译,见下图,但是不影响后面的使用
下面我们制作PHP模块。首先确保安装了 php5-dev 包
然后下载php源代码。我使用的是php-5.2.3.tar.gz,解压缩。
首先做一个简单的so文件:
/**
* gcc -O-c -fPIC -ohello.ohello.c
* gcc -shared -o libhello.sohello.o
*/
int[code]hello_add(int
a,int
b)
{
return
a + b;
}
然后将它编译成.so文件并放到系统中:
$[code]gcc -O
-c -fPIC -ohello.ohello.c
$[code]gcc -shared -o libhello.sohello.o
$[code]su
# echo /usr/local/lib > /etc/ld.so.conf.d/local.conf
# cp libhello.so /usr/local/lib
# /sbin/ldconfig
写段小程序来验证其正确性:
/**
*hellotest.c
* gcc -ohellotest -lhellohellotest.c
*/
#include <stdio.h>
int[code] main()
{
int
a =3
,b =4
;
printf("%d + %d=%d\n"
,a,b,hello_add(a,b));
return0
;
}
编译并执行:
$[code]gcc -ohellotest -lhellohellotest.c
$[code]./hellotest
3[code] +4
=7[/code]
经测试。在Ubuntu上无法通过编译,在Centos下正常编译,见下图,但是不影响后面的使用
下面我们制作PHP模块。首先确保安装了 php5-dev 包
$[code]apt-get install php5-dev
然后下载php源代码。我使用的是php-5.2.3.tar.gz,解压缩。
$wget http://eduunix.ccut.edu.cn/index2/php/php/php-5.3.6.tar.gz[/code]$[code]tar xzvf php-5.3.6.tar.gz$[code]cd php-5.3.6/ext
然后通过下面的命令建立一个名为 hello 的模块。$[code]./ext_skel --extname=hello
执行该命令之后它会提示你应当用什么命令来编译模块,可惜那是将模块集成到php内部的编译方法。如果要编译成可动态加载的 php_hello.so,方法要更为简单。$cdhello
首先编辑 config.m4 文件,去掉第16行和第18行的注释(注释符号为 dnl )16[code]:PHP_ARG_ENABLE(hello,whether to enablehello support,[/code]17[code]:dnl Make sure that the comment is aligned:[/code]18[code]:[ --enable-hello Enablehello support])[/code]
然后执行 phpize5 程序,生成configure脚本:$[code]phpize5
然后打开 php_hello.h,在PHP_FUNCTION(confirm_hello_compiled);之下加入函数声明:PHP_FUNCTION(confirm_hello_compiled);/* For testing,remove later.*/[/code]PHP_FUNCTION(hello_add);
打开 hello.c,在PHP_FE(confirm_hello_compiled, NULL)下方加入以下内容。zend_function_entryhello_functions[]={PHP_FE(confirm_hello_compiled,NULL)/* For testing,remove later.*/[/code]PHP_FE(hello_add,NULL)/* For testing,remove later.*/[/code]{NULL,NULL,NULL}/* Must be the last line inhello_functions[]*/[/code]};
然后在 hello.c 的最末尾书写hello_add函数的内容:PHP_FUNCTION(hello_add){longinta,b;longintresult;if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,"ll",&a,&b) == FAILURE) {return;}result=hello_add(a,b);RETURN_LONG(result);}
保存退出,编译并安装:$[code]./configure$[code]makeLDFLAGS=-lhello$[code]sudo make install此命令会将so放在php的扩展文件去
编辑php的配置文件加载so库$[code]./configure$[code]vim /etc/php5/apache2/php.ini找到extension部分,加入extension=hello.so
然后在 /var/www/ 下建立一个 hello.php 文件,内容如下:<?phpechohello_add(3,4);?>
然后在浏览器中打开hello.php文件,如果显示7,则说明函数调用成功了。
http://blog.csdn.net/sbsujjbcy/article/details/42806865
相关文章推荐
- IPC之共享内存(三)
- c++ new delete重载
- Python error: Microsoft Visual C++ 9.0 is required 解决方案
- 大型c++项目不停止运行获取代码覆盖率
- c语言中的符号优先级问题
- NN远程桌面SDK之VC++开发源码
- C语言宏定义
- C++primer第四版第四章数组与指针
- 【windows线程】线程资源创建与释放
- C++_rand()函数和srand()函数的用法
- c/c++ int _tmain(int argc, _TCHAR* argv[])
- 文件管理
- 使用scanf的注意事项
- 学习c++多态的几个小例子
- c++中用一个变量定义一维数组的元素个数
- c++进程间共享内存
- C++常见code!
- 树莓派编译C++
- C++后缀数组详解
- 【noip 2005】 采药