本文主要讲一下在linux下用打包c扩展程序.so文件和windows下的不同,详细的代码和配置方案请参加另一篇博客:
步骤:
1.安装php环境到目录 /usr/local/php/ 目录下
2.下载相同版本的php源码包,安装到 /root/php-5.6.9/ 目录下,可到凯发k8官网下载客户端中心官网下载
执行命令:
-
cd /root
-
wget http:
-
tar -xf php-5.6.9.tar.bz2
注意,有一些历史版本没有源码包,需要升级php到提供源码包的版本
3.到 /php-5.6.9/ext/ 目录下,使用ext_skel生成扩展骨架
-
cd ./php-5.6.9/ext
-
./ext_skel --extname=test
4.修改配置文件 /test/config.m4
取消下面两行的dnl注释:
-
php_arg_enable(test, whether to enable test support,
-
dnl make sure that the comment is aligned:
-
[ --enable-test enable test support])
如果要使用c 进行编译,要将test.c改名为test.cpp,并在config.m4中添加
-
php_require_cxx()
-
php_add_library(stdc , 1, extra_ldflags)
-
php_new_extension(test, test.cpp, $ext_shared)
5.在php_test.h文件中添加代码,加入自定义的函数声明:
-
php_minit_function(test);
-
php_mshutdown_function(test);
-
php_rinit_function(test);
-
php_rshutdown_function(test);
-
php_minfo_function(test);
-
-
php_function(confirm_test_compiled);
-
php_function(testfunc);
6.在test.c/cpp中添加自定义函数代码:
(1)首先,在这个位置引入用到的头文件:
-
#ifdef have_config_h
-
#include "config.h"
-
#endif
-
-
#include
-
#include
-
#include
-
#include "php.h"
-
#include "php_ini.h"
-
#include "ext/standard/info.h"
-
#include "php_test.h"
否则,会出现很多函数重定义的问题,详见另一篇博客:http://blog.csdn.net/maverick1990/article/details/46786685
(2)然后,在这个位置添加函数入口:
-
const zend_function_entry test_functions[] = {
-
php_fe(confirm_test_compiled, null)
-
php_fe(testfunc, null)
-
php_fe_end
-
};
(3)最后,在文件尾部添加testfunc函数的代码,也可以在这里定义其他自定义函数
-
php_function(testfunc)
-
{
-
char *x = null;
-
char *y = null;
-
int argc = zend_num_args();
-
int x_len;
-
int y_len;
-
-
if (zend_parse_parameters(argc tsrmls_cc, "ss", &x, &x_len, &y, &y_len) == failure)
-
return;
-
-
int result_length = x_len y_len;
-
char* result = (char *) emalloc(result_length 1);
-
strcpy(result, x);
-
strcat(result, y);
-
-
return_stringl(result, result_length, 0);
-
}
关于php_function函数的书写方法,详见博客:
7.在 /root/php-5.6.9/ext/test/ 目录下,建立php扩展模块:
可能需要加上路径:
-
/usr/local/php/bin/phpize
8.回到 /root/php-5.6.9/ 目录,重新建立编译需要的配置:
-
cd ../..
-
./buildconf --force
若出现类似的报错:
-
buildconf: you need autoconf 2.59 or lower to build this version of php.
-
you are currently trying to use 2.63
-
most distros have separate autoconf 2.13 or 2.59 packages.
-
on debian/ubuntu both autoconf2.13 and autoconf2.59 packages exist.
-
install autoconf2.13 and set the php_autoconf env var to
-
autoconf2.13 and try again.
那么,通过下面的方法解决:
-
yum install autoconf213
-
export php_autoconf=/usr/bin/autoconf-2.13
9.再到 /root/php-5.6.9/ext/test/ 目录下,生成配置:
-
./configure --with-php-config=/usr/local/php/bin/php-config
10.编译并生成.so扩展文件
若make出错,修改代码直到编译通过
若make install出错,修改后,需要清空当前生成的扩展模块:
然后从第7步重新开始
11.查看test.so是否生成
make install成功后会给出生成路径,例如:/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/test.so
12.修改php.ini
修改 /usr/local/php/etc/php.ini 文件,加入扩展路径和名称:
-
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/"
-
-
extension = "teste.so"
13.重启php服务
14.在php中使用c 扩展函数
-
阅读(1219) | 评论(0) | 转发(0) |