У меня есть программа, написанная на C, и ее нужно использовать в проекте PHP. Мне удастся использовать SWIG и скомпилированное расширение SO php на Ubuntu. Впоследствии я попытался использовать тот же SO файл в OS X, но 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
Я предложил проблему, вызванную компиляцией на другой операционной системе, и решил создать SO файл в OS X. Я сделал следующее:
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 файл, который отлично работает с PHP на Ubuntu (но не работает в OS X).
В OS X я получаю следующее исключение из компилятора:
Неопределенные символы для архитектуры x86_64: "__efree", на которые ссылаются: _SWIG_Php_GetModule в extension_wrap.o............................................................................................................................. "_zval_is_true", на который ссылаются: __wrap_swig_extension_alter_newobject в extension_wrap.o ld: символ не найден для архитектуры x86_64 clang: ошибка: команда компоновщика завершилась с кодом выхода 1 (используйте -v, чтобы увидеть вызов)
(Я немного сократил выход).
Я буду признателен, если кто-нибудь может посоветовать, как построить расширение PHP на OS X или использовать расширение, основанное на Ubuntu.
заранее спасибо
Последовательность команд, созданных совместно используемой библиотекой, которая может быть успешно использована с PHP на OS X (10.10):
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
Я все еще не понимаю, как это решение работает, но по крайней мере оно работает.