Имеется готовая библиотека написанная на С++, с использованием Qt и собранная под линуксом (*.so) Вносить изменения в библиотеку НЕЛЬЗЯ (ну максимум минимальные изменения типа хедэра). Можно ли её подключить с целью дальнейшего использования её (библиотеки) функций в кодинге на PHP. P.S. Гуглом искал, но не нашёл решения :cry:
Да, был какой-то туманный ответ про какую-то обёртку и предложение погуглить... Гуглил - не помогло Есть такая тема расширения PHP на С с помощью Zend Engine. Но там я так понял библbтотека пишется командами Zend просто компилируется компилятором С. А у меня уже есть готовая библиотека написанная на С++ и мне нужно воспользоватся её функциями без переписывания кода(ну максимум include можно). Помогите, пожайлуста, начальник уже за цугундер взял
Anubis2k Тебе придется написать обертку над этой библиотекой. И эту обертку написать по правилам расширений для PHP. Других вариантов использования библиотеки под unix - нет.
Я повторю. Anubis2k Тебе придется написать обертку над этой библиотекой. И эту обертку написать по правилам расширений для PHP. Других вариантов использования библиотеки нет. Теперь для дураков: Создаешь своё новое расширение для php (php-extension). Смотри в исходниках php есть каталог ext, там должен быть Skeleton (шаблон пустого расширения) Создаешь на базе этого шаблона своё php-расширение, делаешь #include() к своей гуевой библиотеке, пишешь для каждой функции библиотеки функцию_для_php. Для этого существует макрос PHP_FUNCTION Описываешь принимаемые параметры, делаешь вызов функции из своей гуёвой библиотеки, переводишь результат в типы данных от zend и указываешь что твоя php-function возвращает этот результат И так для каждой функции - это есть обертка. Исходный код своей гуёвой библиотеки не трогаешь. компилируешь, прописываешь в php.ini extenstion: my_xyi_library.so перезапускаешь apache
Хорошо, понял... Ну уж библиотека не такая уж куёвая )) Просто в ней несколько мег текста! Я писал её года 2! На переписывание уйдёт уйма времени! Надо расстравать начальника! А я то расписал ему про всемогущество и универсальность php !!! Прощай моя попа... p.S. т.е. проще говоря у меня будет библиотека (на php-zend) над библиотекой(на Qt - C++) А как в плане передаче приёма параметров? Ведь типы данных у Qt отнюдь не Сишные (QString, QList и т.д.)
Anubis2k Твой код -> Zend Engine -> myphpextension.so -> xyilibrary.so Твой код <- Zend Engine <- myphpextension.so <- xyilibrary.so например ты имеешь функции в xyi_library.so Код (Text): int xyi_draw(int i); в php-extensions создаешь функцию Код (Text): PHP_FUNCTION xyi_draw(...){ /* получить входное int */ res = xyi_draw( 4 ); /* вернуть res как php переменную типа int */ } PHP: <?php dl('my_extension.so'); xyi_draw( 4 ); ?> UPD> Anubis2k Два года писать на Си и при этом не найти документации как писать расширения для php, или (что хуже) не суметь разобраться с исходником от php ну уж извините, это надо уметь.
topas Спасибо ты мне очень помог. Не ругайся, такой уж я программер, не по призванию, а по нужде! Не мытьём так катанием. Пишу на Сях уже 8 лет... Кстати, спасибо за идею, достойное название для моей библиотеки, надо переименовать!
Он потому и универсален, что расширение пишется крайне быстро и легко. Можно написать небольшой кодогенератор, который соберет обертку проанализировав исходники твоей либы. В PHP есть ресурсы - некое подобие зашитых структур. Придется делать кастинг типов. Других вариантов нет.
Всё в принципе получается, расширение компилируется Вот только здесь вопрос Т.Е. исходнике расширения, скажем, php_mylib.c, где все инклуды прописываются, просто написать Код (Text): #include "lib/mylib.so" phpiz проходит, configure тоже, а вот на make Выводится куча ошибок!!!! :shock: Может включение библиотеки прописывать где-нибудь в конфигурационном скрипте config.m4? Чего-то не пойму :?
нет, это понятно, спросил неверно хорошо задам вопрос по другому, где в расширении php прописывается путь к моей библиотеки mylib.so?
Anubis2k Я в этом вопросе полный ламер, поэтому линковку указывал в Makefile А вообще, не ручаюсь за точность, для libextend.so: gcc -I /home/local/include/... -L extend (все свои исходники благополучно удалил, ибо незачем Поправьте если ошибаюсь
привет! делаю тоже самое)) тут http://devzone.zend.com/article/4486 уже читал?? у меня не получается только использование((( тестовый модуль собрала и установила при использовании ошибка Fatal error: Class 'Car' not found in /var/www/test_php/test.php on line 2 кстати надо включать в php-скрипт что-нибудь или нет?? для обращения к модулю? в php.ini прописала: ;Windows Extensions ;Note that MySQL and ODBC support is now built in, so no dll is needed for it. ; ;extension=php_bz2.dll ;extension=php_cpdf.dll .... ;extension=php_xslt.dll ;extension=php_yaz.dll ;extension=php_zip.dll extention=vehicles.so смущает, что написано windows extention linux extention не нашла(
zaytsewa минимум надо язать *.dll версии библиотек, а у вас похоже что библиотека скомпилена под линукс, запустить пытаетесь на винде, отсюда бадабум имхо)
после прочтения всех статей и сборки всех examlo'в у меня возникло много-много вопросов: (всё равно кстати примеры работать не хотят) 1) в какой папке необходимо собирать исходники - в любой или в include/php/ext/ ? 2) как надо устанавливать собранный модуль? make install php -d"extension=mylib.so" -m или cp ./modules/mylib.so lib/php/extensions как и где указать, что мой модуль зависит ещё от динамических сишных библиотек и от Qt? +я ничего не поняла зачем переписывать код функций, которые и так написаны - ладно ещё с выделением/удалением памяти - это ещё хоть как-то понятно, а вот всё остальное... + отсюда вопрос - нужны ли исходники, т.е. исходная либа на C где она должна лежать где указать путь к ней?? phpdude, я работаю в Linux