如何使用SWIG在OS X上编译PHP扩展

时间:2015-02-24 15:17:04

标签: php c macos shared-libraries swig

我有一个用C编写的程序,需要在PHP项目中使用它。我成功使用SWIG并在Ubuntu上编译了SO php扩展。之后我尝试在OS X上使用相同的SO文件 - 但是php会抛出以下错误:

  

PHP错误[2]:dl():无法加载动态库'/usr/lib/php/extensions/no-debug-non-zts-20121212/extension.so' - dlopen(/ usr / lib / php / extensions / no-debug-non-zts-20121212 / extension.so,9):找不到合适的图像。
  找到了:/usr/lib/php/extensions/no-debug-non-zts-20121212/extension.so:未知文件类型,前八个字节:0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x00

我建议在另一个操作系统上编译引起问题,并决定在OS X上创建SO文件。我做了以下操作:

swig -php extension.i
gcc `php-config --includes` -fpic -c extension_wrap.c extension.c
gcc -shared extension_wrap.o extension.o -o extension.so

在Ubuntu上,这三个命令成功执行,我得到一个SO文件,可以在Ubuntu上使用PHP(但在OS X上失败)。   在OS X上,我从编译器中得到以下异常:

  

架构x86_64的未定义符号:     “__efree”,引自:         extension_wrap.o中的_SWIG_Php_GetModule   .................................................. .................................................. .........................     “_zval_is_true”,引自:         在extension_wrap.o中的__wrap_swig_extension_alter_newobject   ld:找不到架构x86_64的符号   clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

(我稍微缩短了输出)。

如果有人可以建议如何在OS X上构建PHP扩展或使用基于Ubuntu构建的扩展,我将不胜感激。

提前致谢

1 个答案:

答案 0 :(得分:1)

以下命令序列产生了共享库,可以在OS X(10.10)上成功地与PHP一起使用:

swig -php extension.i
gcc `php-config --includes` -fpic -c extension_wrap.c extension.c
gcc -bundle -bundle_loader /usr/bin/php -dynamic *.o -o extension.so

我仍然不明白这个解决方案是如何运作的,但至少它可行。