c — загрузить модуль расширения PHP не удалось

Я хотел бы создать * .so, затем сделать его модулем расширения PHP и вызывать функции в * .so через PHP.

Мой шаг, как показано ниже:

  1. Создайте библиотеку C под Linux, сначала создайте hello.c

    int hello_add(int a, int b)
    {
    return a+b;
    }
    

Затем постройте, как показано ниже:

    gcc -O -c -fPIC -o hello.o hello.c
gcc -shared -o libhello.so hello.o
  1. скачать исходный код php 5.2.17

  2. tar -zxvf php.5.2.17.tar.gz

  3. CD php.5.2.17

  4. ./ configure ./configure —prefix = / home / user1 / php-5.2.17

  5. делать & сделать установку

  6. CD Ext;

  7. ./ ext_skel —extname = привет

  8. CD привет

  9. отредактируйте config.m4, удалив dnl в строке 16-18, затем сохраните и выйдите.

    16: PHP_ARG_ENABLE(hello, whether to enable hello support,
    17: dnl Make sure that the comment is aligned:
    18: [ --enable-hello Enable hello support])

  10. выполните команду: /home/user1/php-5.2.17/bin/phpize

  11. откройте php_hello.h, добавьте
    PHP_FUNCTION(hello_add);

  12. открыть hello.c изменить на:

    zend_function_entry hello_functions[] = {
    PHP_FE(confirm_hello_compiled, NULL) /* For testing, remove later. */
    PHP_FE(hello_add, NULL) /* For testing, remove later. */
    {NULL, NULL, NULL} /* Must be the last line in hello_functions[] */
    };

    В конце файла добавьте

    PHP_FUNCTION(hello_add)
    {
    long int a, b;
    long int result;
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) {
    return;
    }
    result = hello_add(a, b);
    RETURN_LONG(result);
    }

  13. ./configure --with-php-config=/home/usr1/php-5.2.17/bin/php-config

  14. make LDFLAGS=-lhello

  15. Затем hello.so создается в /home/usre/php-5.2.17/ext/hello/modules, но
    использование nm hello.so это печатает:

                `U hello_add
    0000000000000a98 T _init`
    
  16. Создайте php-файл для тестирования:

    <?php
    if(!dl('btest.so'))
    {
    echo "can not load hello.so";
    }
    else
    {
    echo "load is done";
    echo hello_add(3,4);// here it will throw error in the log
    }
    ?>

в журнале жалуется
[28-Sep-2014 18:38:28] Неустранимая ошибка PHP: вызов неопределенной функции hello_add () ….

Кстати, я скопировал hello.so в другую среду LAMP, не используя PHP, только для сборки. Обе версии 5.2.17.

Кто-нибудь может указать, что происходит?

1

Решение

В то время как в шаге 15 измените LDFLAGS = lhello на LDFLAGS = hello.o, тогда это работает. Я не знаю, что не так с * .so. Во всяком случае, это сейчас исправлено.

1

Другие решения

Я попытался —with-hello = DIR, что такое DIR? путь к libhello.so или расширение php — путь hello?

0