我想要的是构建一个* .so,然后将其作为PHP扩展模块,并通过PHP调用* .so中的函数。
我的步骤如下:
在linux下构建C库,首先创建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
下载php 5.2.17源代码
tar -zxvf php.5.2.17.tar.gz
cd php.5.2.17
./ configure ./configure --prefix = / home / user1 / php-5.2.17
make& make install
cd ext;
./ ext_skel --extname = hello
cd hello
通过删除第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])
执行命令:/home/user1/php-5.2.17/bin/phpize
打开php_hello.h,添加
PHP_FUNCTION(hello_add);
打开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);
}
./configure --with-php-config=/home/usr1/php-5.2.17/bin/php-config
make LDFLAGS=-lhello
然后在/home/usre/php-5.2.17/ext/hello/modules下生成hello.so,但是
使用nm hello.so
打印:
`U hello_add
0000000000000a98 T _init`
创建一个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
}
?>
在日志中,它抱怨: [2014年9月28日18:38:28] PHP致命错误:调用未定义函数hello_add()....
顺便说一句,我将hello.so复制到另一个LAMP环境中,而不是使用PHP构建。这两个版本都是5.2.17。任何人都可以指出发生了什么事吗?
答案 0 :(得分:1)
在步骤15中,将LDFLAGS = lhello更改为LDFLAGS = hello.o,然后它可以工作。我不知道* .so有什么问题。无论如何它现在已经修好了。
答案 1 :(得分:0)
我试过--with-hello = DIR,DIR是什么?是libhello.so的路径还是php扩展 - 你好的路径?