У меня есть программа, написанная на 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: error: команда компоновщика завершилась неудачно с кодом выхода 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
Я до сих пор не понимаю, как работает это решение, но, по крайней мере, оно работает.
Других решений пока нет …