我一直在尝试使用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工作的指针或示例都将非常感激。感谢
答案 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)