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

How to compile PHP extension on OS X using SWIG

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

PHP Error[2]: dl(): Unable to load dynamic library '/usr/lib/php/extensions/no-debug-non-zts-20121212/extension.so' - dlopen(/usr/lib/php/extensions/no-debug-non-zts-20121212/extension.so, 9): no suitable image found.
Did find: /usr/lib/php/extensions/no-debug-non-zts-20121212/extension.so: unknown file type, first eight bytes: 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 上,编译器出现以下异常:

Undefined symbols for architecture x86_64: "__efree", referenced from: _SWIG_Php_GetModule in extension_wrap.o ............................................................................................................................. "_zval_is_true", referenced from: __wrap_swig_extension_alter_newobject in extension_wrap.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

(我稍微缩短了输出)。

如果有人可以建议如何在 OS X 上构建 PHP 扩展或使用在 Ubuntu.

上构建的扩展,我将不胜感激

提前致谢

以下命令序列生成的共享库可以在 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

我仍然不明白这个解决方案是如何工作的,但至少它是有效的。