За последние 24 часа нас посетили 15998 программистов и 1487 роботов. Сейчас ищут 845 программистов ...

Расширение в виде готовой библиотеки *nix на С++

Тема в разделе "Прочие вопросы по PHP", создана пользователем Anubis2k, 8 фев 2010.

  1. Anubis2k

    Anubis2k Активный пользователь

    С нами с:
    6 фев 2010
    Сообщения:
    13
    Симпатии:
    0
    Имеется готовая библиотека написанная на С++, с использованием Qt и собранная под линуксом (*.so) Вносить изменения в библиотеку НЕЛЬЗЯ (ну максимум минимальные изменения типа хедэра). Можно ли её подключить
    с целью дальнейшего использования её (библиотеки) функций в кодинге на PHP.
    P.S. Гуглом искал, но не нашёл решения :cry:
     
  2. Мне кажется, или я на этот вопрос отвечал позавчера?
     
  3. Anubis2k

    Anubis2k Активный пользователь

    С нами с:
    6 фев 2010
    Сообщения:
    13
    Симпатии:
    0
    Да, был какой-то туманный ответ про какую-то обёртку и предложение погуглить...
    Гуглил - не помогло :(
    Есть такая тема расширения PHP на С с помощью Zend Engine. Но там я так понял библbтотека пишется командами Zend просто компилируется компилятором С.
    А у меня уже есть готовая библиотека написанная на С++ и мне нужно воспользоватся её функциями без переписывания кода(ну максимум include можно).
    Помогите, пожайлуста, начальник уже за цугундер взял :(
     
  4. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Anubis2k
    Тебе придется написать обертку над этой библиотекой.
    И эту обертку написать по правилам расширений для PHP.

    Других вариантов использования библиотеки под unix - нет.
     
  5. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Я повторю.

    Anubis2k
    Тебе придется написать обертку над этой библиотекой.
    И эту обертку написать по правилам расширений для PHP.

    Других вариантов использования библиотеки нет.

    Теперь для дураков:

    Создаешь своё новое расширение для php (php-extension). Смотри в исходниках php есть каталог ext, там должен быть Skeleton (шаблон пустого расширения)

    Создаешь на базе этого шаблона своё php-расширение, делаешь #include() к своей гуевой библиотеке,
    пишешь для каждой функции библиотеки функцию_для_php. Для этого существует макрос PHP_FUNCTION
    Описываешь принимаемые параметры, делаешь вызов функции из своей гуёвой библиотеки, переводишь результат в типы данных от zend и указываешь что твоя php-function возвращает этот результат

    И так для каждой функции - это есть обертка. Исходный код своей гуёвой библиотеки не трогаешь.


    компилируешь, прописываешь в php.ini extenstion: my_xyi_library.so

    перезапускаешь apache
     
  6. Anubis2k

    Anubis2k Активный пользователь

    С нами с:
    6 фев 2010
    Сообщения:
    13
    Симпатии:
    0
    Хорошо, понял...
    Ну уж библиотека не такая уж куёвая ;)))
    Просто в ней несколько мег текста! Я писал её года 2!
    На переписывание уйдёт уйма времени!
    Надо расстравать начальника! А я то расписал ему про всемогущество и универсальность php !!!
    Прощай моя попа...
    p.S. т.е. проще говоря у меня будет библиотека (на php-zend) над библиотекой(на Qt - C++)
    А как в плане передаче приёма параметров? Ведь типы данных у Qt отнюдь не Сишные (QString, QList и т.д.)
     
  7. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Anubis2k
    Твой код -> Zend Engine -> myphpextension.so -> xyilibrary.so
    Твой код <- Zend Engine <- myphpextension.so <- xyilibrary.so

    например ты имеешь функции в xyi_library.so
    Код (Text):
    1. int xyi_draw(int i);
    в php-extensions создаешь функцию

    Код (Text):
    1. PHP_FUNCTION xyi_draw(...){
    2.   /* получить входное int */
    3.   res = xyi_draw( 4 );
    4.   /* вернуть res как php переменную типа int */
    5. }
    PHP:
    1. <?php
    2. dl('my_extension.so');
    3. xyi_draw( 4 );
    4. ?>
    5.  
    UPD>
    Anubis2k
    Два года писать на Си и при этом не найти документации как писать расширения для php, или (что хуже) не суметь разобраться с исходником от php

    ну уж извините, это надо уметь.
     
  8. Anubis2k

    Anubis2k Активный пользователь

    С нами с:
    6 фев 2010
    Сообщения:
    13
    Симпатии:
    0
    topas
    Спасибо ты мне очень помог.
    Не ругайся, такой уж я программер, не по призванию, а по нужде! Не мытьём так катанием.
    Пишу на Сях уже 8 лет...
    Кстати, спасибо за идею, достойное название для моей библиотеки, надо переименовать! ;)
     
  9. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Он потому и универсален, что расширение пишется крайне быстро и легко.

    Можно написать небольшой кодогенератор, который соберет обертку проанализировав исходники твоей либы.

    В PHP есть ресурсы - некое подобие зашитых структур.
    Придется делать кастинг типов. Других вариантов нет.
     
  10. Anubis2k

    Anubis2k Активный пользователь

    С нами с:
    6 фев 2010
    Сообщения:
    13
    Симпатии:
    0
    Всё в принципе получается, расширение компилируется
    Вот только здесь вопрос
    Т.Е. исходнике расширения, скажем, php_mylib.c, где все инклуды прописываются, просто написать
    Код (Text):
    1. #include "lib/mylib.so"
    phpiz проходит, configure тоже, а вот на make Выводится куча ошибок!!!! :shock:
    Может включение библиотеки прописывать где-нибудь в конфигурационном скрипте config.m4? Чего-то не пойму :?
     
  11. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    мож все-таки lib.mylib.h ?


    нафига в исходниках бинарные либы?
    О_о
     
  12. Anubis2k

    Anubis2k Активный пользователь

    С нами с:
    6 фев 2010
    Сообщения:
    13
    Симпатии:
    0
    нет, это понятно, спросил неверно
    хорошо задам вопрос по другому, где в расширении php прописывается путь к моей библиотеки mylib.so?
     
  13. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    наверное на уровне линковки либ? но никак не их компиляции?
    =)
     
  14. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Anubis2k
    Я в этом вопросе полный ламер, поэтому линковку указывал в Makefile :)

    А вообще, не ручаюсь за точность, для libextend.so:
    gcc -I /home/local/include/... -L extend
    (все свои исходники благополучно удалил, ибо незачем :)

    Поправьте если ошибаюсь
     
  15. zaytsewa

    zaytsewa Активный пользователь

    С нами с:
    2 авг 2010
    Сообщения:
    2
    Симпатии:
    0
    привет! делаю тоже самое))
    тут 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 не нашла(
     
  16. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
  17. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    zaytsewa
    минимум надо язать *.dll версии библиотек, а у вас похоже что библиотека скомпилена под линукс, запустить пытаетесь на винде, отсюда бадабум имхо)
     
  18. zaytsewa

    zaytsewa Активный пользователь

    С нами с:
    2 авг 2010
    Сообщения:
    2
    Симпатии:
    0
    после прочтения всех статей и сборки всех 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