PHP Swig示例

时间:2014-03-08 04:46:28

标签: php swig

我一直在尝试使用Swig工作为PHP创建一个动态创建的扩展,我无法弄清楚如何让这个示例工作。从他们的网站:

/* File : example.c */

double  My_variable  = 3.0;

/* Compute factorial of n */
int  fact(int n) {
    if (n <= 1) return 1;
    else return n*fact(n-1);
}

/* Compute n mod m */
int my_mod(int n, int m) {
    return(n % m);
}

/* File : example.i */
%module example
%{
/* Put headers and other declarations here */
extern double My_variable;
extern int    fact(int);
extern int    my_mod(int n, int m);
%}

extern double My_variable;
extern int    fact(int);
extern int    my_mod(int n, int m);

swig -php example.i
gcc `php-config --includes` -fpic -c example_wrap.c
gcc -shared example_wrap.o -o example.so
[php.ini]
extension=/path/to/modulename.so

一切都按预期工作但我无法将模块加载到PHP中。继续收到以下错误:

未定义的符号:第11行的/var/www/html/test/time.php中的My_variable

我无法弄清楚如何让它发挥作用,我也无法在互联网上的任何地方找到工作示例。任何有关如何让Swig工作的指针或示例都将非常感激。感谢

3 个答案:

答案 0 :(得分:0)

在INI文件中你应该有

extension=/path/to/example.so

但是,这将为每个PHP脚本加载扩展,无论脚本是否使用您的扩展。你应该使用

include("example.php");

我不太了解PHP,但基于SWIG文档的PHP部分,我的猜测是My_variable等全局变量可以通过_get()_set()函数调用来访问。例如:

include("example.php");
print My_variable_get();
My_variable_set( My_variable_get() * 2 );
print My_variable_get(); # prints 6

这可能也是问题所在。

答案 1 :(得分:0)

在编译步骤中,您错过了源文件,其中包含全局My_Varible,函数fact()和函数my_mode()的定义。所以编译的第一步应该是

gcc `php-config --includes` -fpic -c example_wrap.c example.c

然后将步骤链接为

gcc -shared example_wrap.o example.o -o example.so

您收到的变量未找到错误,因为您的库未包含变量的实际定义,它只有声明。

答案 2 :(得分:0)

使用小写字母表示导出名称(My_variable ==&gt; my_variable)