Big Bug Ban

兴趣 践行 创新

用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

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.c

gcc -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

http://www.swig.org/

Written by princehaku

2月 15th, 2012 at 11:48 上午

Posted in php

Tagged with ,

without comments

Leave a Reply