Archive for the ‘swig’ tag
用swig构建php扩展
swig是个将使用c/c++编写的软件与其他编程语言对接的工具
简单的说,它可以把你已经写好的c/c++源代码通过转换变成python,php,java等的扩展
让你可以在这类高级语言中使用底层c++
它支持php,可以编译成php的扩展供我们调用
下面是一段c++函数
#include <stdio.h> #include <stdlib.h> #include <string.h> char *helloworld(); char *helloworld() { char *target = "helloworld"; return target;
}
然后我们试试把它搞成一个php扩展。
上面的文件是helloworld.c
我们需要先安装swig。
源码可以从http://www.swig.org/download.html获取,然后编译安装
或者从apt源中获取,core中已经包含有swig,使用apt-get install swig安装。
然后在他目录下新建一个helloworld.i,写入swig的模块规则
%module helloworld
%{
extern char * helloworld();%}
extern char * helloworld();
接下来使用swig
swig -php helloworld.i
然后你会发现目录里面多出几个文件
helloworld_wrapper.c
helloworld.php
其中的helloworld_wrapper.c是通过转换后的c代码,把他编译成so模块
cc -fpic -c helloworld.c
gcc `php-config –includes` -fpic -c helloworld_wrap.cgcc -shared helloworld.o -o helloworld.so
注意其中使用了php-config –includes,这个命令是获得php源码的include目录
如果你没有php源码。去下载一个吧。或者用apt-get install php-dev安装附属的头和库文件
编译好的helloworld.so就可以放php扩展里面试试了。复制到php扩展目录,修改好php.ini
然后重启apache。
我们来试试
<?php echo helloworld(); ?>
恩..就可以看到效果了
当然,每次调试都很麻烦。自己写个shell什么的会快一点
像这样,
#!/bin/bash rm *.o -f swig -php $1.i cc -fpic -c $1.c gcc `php-config --includes` -fpic -c $1_wrap.c gcc -shared *.o -o $1.so sudo cp $1.so `php-config --extension-dir` service apache2 restart
参考文档:
http://www.ibm.com/developerworks/cn/opensource/os-php-swig/index.html