加载PHP扩展模块失败

时间:2014-09-28 11:40:16

标签: php c linux php-extension undefined-function

我想要的是构建一个* .so,然后将其作为PHP扩展模块,并通过PHP调用* .so中的函数。

我的步骤如下:

  1. 在linux下构建C库,首先创建hello.c

    int hello_add(int a, int b)
    {
        return a+b;
    }
    
  2. 然后构建如下:

        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. make& make install

    6. cd ext;

    7. ./ ext_skel --extname = hello

    8. cd hello

    9. 通过删除第16-18行中的dnl编辑config.m4,然后保存并退出。

      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. 然后在/home/usre/php-5.2.17/ext/hello/modules下生成hello.so,但是  使用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 } ?>

    17. 在日志中,它抱怨: [2014年9月28日18:38:28] PHP致命错误:调用未定义函数hello_add()....

      顺便说一句,我将hello.so复制到另一个LAMP环境中,而不是使用PHP构建。这两个版本都是5.2.17。

      任何人都可以指出发生了什么事吗?

2 个答案:

答案 0 :(得分:1)

在步骤15中,将LDFLAGS = lhello更改为LDFLAGS = hello.o,然后它可以工作。我不知道* .so有什么问题。无论如何它现在已经修好了。

答案 1 :(得分:0)

我试过--with-hello = DIR,DIR是什么?是libhello.so的路径还是php扩展 - 你好的路径?