当前位置: 首页 > news >正文

LINUX下PHP生成并调用C的.so文件

1,安装PHP环境到/usr/local/php

2,进入源码包cd  /usr/local/php-5.5.3

3,建立要生成的.so文件的扩展骨架

    cd  /usr/local/php-5.5.3

    ./ext_skel --extname=test

   test就是你要生成的.so的名字,例如test.so

4,修改配置文件/test/config.m4

    取消下面两行的dnl注释,即去掉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,并在/test/config.m4中加入一下(如果不是C++,则不需要)

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);	/* For testing, remove later. */PHP_FUNCTION(testFunc);

6,在test.c(test.cpp)中加入自定义函数代码:

   (1)在该位置引入用到的头文件

#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <stdio.h>#include <string.h>#include <math.h>
#include "php.h"#include "php_ini.h"#include "ext/standard/info.h"#include "php_test.h"

(2)在该位置加入函数入口


const zend_function_entry test_functions[] = {	PHP_FE(confirm_test_compiled, NULL)		/* For testing, remove later. */	PHP_FE(testFunc, NULL)	PHP_FE_END	/* Must be the last line in test_functions[] */};

  (3)在文件尾部添加函数代码,也可以在这里定义其他函数

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);  } 


7,建立扩展模块,直接输入以下
/usr/local/php/bin/phpize
(/usr/local/php是php的安装路径,这个要看你安在哪了,但建议软件都安装在/usr/local下)
8,如下
./configure  --with-php-config=/usr/local/php/bin/php-config     (/usr/local/php/bin/php-config是你安装的php的路径)
make
make install
说明一下,如果make出错,改好后继续make;如果make install 出错,需要执行make clean 和/usr/local/php/bin/phpize --clean
9,查看test.so是否生成
make insall成功后会给出路径
一般放在:/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/test.so

*************************************************以上就生成.so文件了***********************分割线********************************************************************************************************
下面讲解如何调用
很简单
修改php.ini文件
/usr/local/lib/php.ini(这个路径都不大相同,具体要看你放在哪了,如果找不到,那么去根目录下执行这条指令find -name php.ini)
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/"
extension = "teste.so"
之后重启php或者apache即可

**********************************************以上内容就完成了**********************************************分割线************************************************************************************************************************

下面补充一个过程中可能会出现的错误:autoconf有关的错误
解决如下:
yum list autoconf*
之后会列出几个版本,选择最高版本的安装,比如说2.59
yum install autoconf259
成功之后需要配置环境变量:
export PHP_AUTOCONF=/usr/bin/autoconf-2.59
export PHP_AUTOHEADER=/usr/bin/autoheader-2.59



完!



  

相关文章:

  • linux下apache+php的安装配置(源码)
  • linux多文件编译—makefile
  • linux下,使用php将C扩展打包成.so文件补充——动态库
  • 安装第三方yum源
  • cannot find -lxxx
  • linux下的环境变量配置
  • nm命令
  • 错误解决:apachectl: line 78:  5160 段错误     $HTTPD -k $ARGV
  • 问题解决Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 38218371 bytes)
  • 数字信封详解
  • HTTP协议概述
  • SSL协议概述
  • ASN.1之tag
  • DER编码规则详解
  • RSA算法原理
  • __proto__ 和 prototype的关系
  • 78. Subsets
  • co.js - 让异步代码同步化
  • github指令
  • isset在php5.6-和php7.0+的一些差异
  • java 多线程基础, 我觉得还是有必要看看的
  • Java程序员幽默爆笑锦集
  • QQ浏览器x5内核的兼容性问题
  • React-Native - 收藏集 - 掘金
  • 关于 Cirru Editor 存储格式
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 回顾 Swift 多平台移植进度 #2
  • 驱动程序原理
  • 三栏布局总结
  • 手机端车牌号码键盘的vue组件
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 微信公众号开发小记——5.python微信红包
  • 移动端唤起键盘时取消position:fixed定位
  • #pragma 指令
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (二)斐波那契Fabonacci函数
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • **PHP分步表单提交思路(分页表单提交)
  • .gitignore文件—git忽略文件
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .Net语言中的StringBuilder:入门到精通
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [Angular 基础] - 指令(directives)
  • [autojs]逍遥模拟器和vscode对接
  • [BUG] Authentication Error
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [CentOs7]搭建ftp服务器(2)——添加用户
  • [codevs] 1029 遍历问题
  • [CSS] 点击事件触发的动画