PHP Extension Makefile 製作
2019独角兽企业重金招聘Python工程师标准>>>
PHP Extension 是什么呢?很多写PHP的工程师,或许不知道PHP Extension是怎么做出来的,其实PHP 的最底层是使用c 语言,每一句PHP 的语法,都是透过c 语言来实现,所以我们可以藉由c ,去加强PHP 的功能,让PHP 更方便使用,一个正常的PHP Extension制作时,要先编写config.m4 这个档案,虽然这个档案不难写,不过他与Makefile的格式落差很大,这里就介绍如何使用Makefile 来编译PHP Extension ,先介绍一下正常的PHP Extension编译流程,phpize会建立Makefile档案, ./configure 这个指令会自动检查相关package 是否安装
- 建立c code 与config.m4
- phpize (下Linux 指令phpize)
- ./configure
- make
- mv modules/xxx.so /extension : 将编译出来的so档,搬到extension目录下,这样就算完成一个PHP Extension
制作php extension Makefile
基实phpize的行为就是建立Makefile, libtool 等等工具,./configure就是检查一些设定是否正常,以及路径设定,即然我都要自已写php extension了,那就跳过这两个过程吧,自已写Makefile。
- 首先我们先使用phpize ,自动生出一个Makefile,然后再把他改成我们想要的格式。
- phpize & mv Makefile Makefile.global : 把Makefile改成Makefile.global
修改Makefile.global成我们要的样子Makefile.global范例
- 加入php 安装的目录PHP_DIR = /home/program/php (路径自已修改吧)
- 将部分变数的值改到PHP_DIR ,如prefix = $(PHP_DIR),phpincludedir = $(PHP_DIR)/include/php
- phplibdir = $(SRC_PATH)/modules :指定编译完成后,so档的路径
- PHP_PECL_EXTENSION = extension name //(注意名称不要重覆)
- srcdir , builddir , top_srcdir , top_builddir ,修改至当前目录,要用绝对目录
简化过后的Makefile
Makefile.global弄半天,最后终于简化完成,以后要编译php extension就方便多了,正式写一个要用来编译程式的Makefile ,你看! 下面的PHP Makefile 多么简短。
Example
SRC_PATH = $ ( shell pwd )
LDEF = - DCOMPILE_DL_MyExtension
CXXFILE = myClass . cc extension . cc
EXTRA_CXXFLAGS =
CXXOUTPUT = MyExtension
include Makefile . global
cp : sudo cp ./ modules / $ ( CXXOUTPUT ). so / home / php_extension /
make 的结果
Example
create myClass . lo
create myClass . o
create extension . lo
create extension . o
create MyExtension . la
create MyExtension . so
//最后产生MyExtension.so 成功
接收php 传进来的变数的方式,使用zend_parse的function,有下列两种,其中[sal,lsl]代表要接放的变数型态。
- zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,"sal",xxx,xx)
- zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET,num_args TSRMLS_CC,"lsl", xx,xx,xx,xx)
- l : 代表long
- s : string
- a : array
- b : boolean
- d : double
- 回传result 给php的方式有下列几种
- RETURN_LONG : 回传long
- RETURN_STRING : 回传字串
- RETURN_DOUBLE : 回传倍精数
- RETURN_BOOL : 回传boolean (true or false)
建立一个php extension function
要写一个extension function ,就是使用PHP_FUNCTION 这个function ,而传进去的第一个参数,就是function 名称,写好之后,就可以在php 里使用simple("xxx");
Example
PHP_FUNCTION ( simple )
{ char * str = NULL ; char * tmp = new char [ 50 ]; string result = "" ; int str_len = 0 ; if ( zend_parse_parameters ( ZEND_NUM_ARGS () TSRMLS_CC , "s" , & str ,& str_len ) == FAILURE ) { RETURN_NULL (); } sprintf ( tmp , "Your input string is [%s]" , str ); result = tmp ; delete [] tmp ; RETURN_STRING ( const_cast < char *>( result . c_str ()), 1 ); }
第二个范例是function entry 中定义的add ,主要功能是将第一个参数与第二个参数做加总的功能,在php extension 中,所有的数字回偾都是使用RETURN_LONG,不需要依int ,long,float 去判断回传值,这是由于php 变数型态很自由,不用区分得这么细。
Example
PHP_FUNCTION ( add )
{ int num_args = ZEND_NUM_ARGS (); if ( num_args != 2 ) { RETURN_LONG ( 0 ); } int result = 0 , int1 , int2 ; if ( zend_parse_parameters ( ZEND_NUM_ARGS () TSRMLS_CC , "ll" , & int1 ,& int2 ) == FAILURE ) { RETURN_NULL (); } result = int1 + int2 ; RETURN_LONG ( result ); }
相关问题
warning: deprecated conversion from string constant to 'char*'
我升级gcc 4.2.0 后,编译就会出现这个Warning,使用gcc 3.4.6 就没事了。
第二招,碰到Warning不要停掉,在Makefile档案中,将-Werror 这个属性拿掉吧
undefined symbol:__gxx_personality_v0
因为你使用c++ 语法,但是却没有载入c++ 的library
解法:将Makefile 的CC 加上-lstdc++ ,加上这句后,编译时,会自动载入/usr/lib/libstdc++.so。
Example
CC = cc - lstdc ++
错误: Invalid library (maybe not a PHP library)的处理
这代表,php在载入so档时,找不到程序入口,c & c++的程序入口是main ,而php extension的程序入口是zend_module_entry ,但是因为我有使用到c++ 语法,c++有个特性,在编译时,会自动乱改变数及function名称。
Example
zend_module_entry MyExtension_module_entry
像这句语法,经过c++ 编译后,就可能变成MyExtension_module_entryii,结果造成找不到程序入口而报错。
解法就是多加一句extern "C"
Example
zend_module_entry MyExtension_module_entry = { } extern "C" { ZEND_GET_MODULE ( MyExtension )
}
为何要加extern "C" 呢?
我们知道C++ 有overloading 的功能,一个function 可以有多种不同的参数数量,可是c++ 是怎么办到的呢,其实他在编译程式的时候,就会自动做function name 的mapping ,例如下面的例子,可是单纯的c 语言并不懂这个东西,所以当c 语言要去读取c++ 的function 时,就必需加上extern "C" ,强迫c++ 不要乱改名称,这样c语言才能正确的执行function 。
Example
int test ( int a ){}
int test ( char b , char c ){} //编译后
test ( int a ) => test_1 ( int a )
test ( char b , char c ) => test_2 ( char b , char c )
转载于:https://my.oschina.net/mickelfeng/blog/343420
PHP Extension Makefile 製作相关推荐
- 用C#製作PDF文件全攻略
PDF文件是目前比較流行的電子文檔格式,在辦公自動化(OA)等軟件的開發中,經常要用到該格式,但介紹如何製作PDF格式文件的資料非常少,在網上搜來搜去,都轉貼的是同一段「暴力」破解的方法,代碼片斷如下 ...
- 從turtle海龜動畫 學習 Python - 高中彈性課程系列 10.2 藝術畫 Python 製作生成式藝術略覽
Goal: 藉由有趣的「海龜繪圖」學會基礎的 Python 程式設計 本篇著重在以 Python 海龜繪圖模擬藝術圖形, 討論與生成式藝術的關聯. 本篇我們列舉一些網路上見到的, 用電腦程式或某些軟體 ...
- PHP Plurk Api基礎教學(一) - 如何製作自動發噗機器人
PHP Plurk Api基礎教學(一) - 如何製作自動發噗機器人 1.第一步 到Plurk PHP APi Google code官網下載最新的PHP API 上面的連結是1.6.2版(聽說已經是 ...
- Swift 教學:如何使用iOS Charts API 製作漂亮的圖表
在應付許多的資料時,比起只在表格中呈現,使用圖表來顯示資料,可以幫助使用者容易地了解資訊.有了圖表,相對於讀取整個資料表(或幾個資料表)你可以輕鬆地一眼便見到以圖形表示的資料,取得所需的資訊.圖表的使 ...
- LabelImg 影像標註工具使用教學,製作深度學習用的資料集
本篇介紹如何使用 LabelImg 這個免費的影像標註工具,標示照片中的物體,製作成可用來訓練深度學習引擎的輸入資料集. 在使用深度學習來實作影像的物件偵測時,都會需要有大量的已知資料集,也就是照片加 ...
- Linux内核中makefile有什么作用?深入解析makefile工作过程和原理
Table of Contents Makefile 中的变量 常用的变量有以下几类: 1) 版本信息 2) CPU 体系结构:ARCH 3) 路径信息:TOPDIR, SUBDIRS 4) 内核组成 ...
- linux源码Makefile详解(完整)-转
随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 Linux 内核级的开发中.面对日益庞大的 Linux 内核源代码,开发者在完成自己的内核代码后, ...
- OpenCV繪圖的實作-cvCircle,cvEllipse,cvEllipseBox
转自:http://www.90in.net/space-4-do-blog-id-10218.html OpenCV繪圖的實作-cvCircle,cvEllipse,cvEllipseBox 圓的製 ...
- opencv在电脑屏幕上画_opencv平滑处理?opencv 画实心圆?OpenCV繪圖的實作-cvCircle,cvEllipse,cvElli...
你是否正在寻找关于cvcircle的内容?让我把最吸引人的东西奉献给你: 转自: OpenCV繪圖的實作-cvcircle,cvEllipse,cvEllipseBox 圓的製作,要給他目標圖片,圓心 ...
最新文章
- Android HTTP2 + Oauth2 + Jwt 接口认证实例
- 结对项目——最大子数组
- python两个编程环境_多个python Behave环境安装文件
- java复习系列[4] - Java IO
- php自定义tcp协议,如何实现自定义协议?
- Jsp+Servlet+Mysql实现的火车票预定管理
- 初学关键段容易忽略的问题
- A股开盘:深证区块链50指数涨0.18%,概念股涨多跌少
- activiti 设置候选人_中标 | 河南移动公示无源波分复用设备集采中标候选人名单:3家厂商上榜...
- 闲谈REST API
- 实体词典 情感词典_情感词典
- 数据资料网站_更新......
- C++中float和double的比较
- 什么是 AngularJS?
- 【云原生】MYSQL语法总结
- 黄河中下游地区精化似大地水准面研究与实施
- 找出数组中其中最大的数及其下标
- PhpStorm修改字体和主题
- 三维动画在计算机上的应用,三维动画的十大应用领域
- 华宝小t股票机器人_基于算法自动抓取日内波动价差,智能炒股机器人,了解一下?...
热门文章
- 图像处理:图像中噪声分布和概率密度函数的关系
- python运行不了、显示警告_Python中偶尔遇到的细节疑问(二):UnicodeDecodeError,警告与忽略警告warnings...
- python ui框架_PyQt5GUI项目程序框架
- linux 爬虫工具,技术|如何在Ubuntu 14.04 LTS安装网络爬虫工具:Scrapy
- Java高并发编程(三):Java内存模型
- 北师计算机应用基础离线作业2,[北京师范大学]18秋《计算机应用基础(专科)》 离线作业2...
- python 输出字符串编码_Python print 字符串编码问题
- 在VM虚拟机Windows Server r2上部署安装Microsoft Dynamics CRM 2016 步骤详解(一)
- BZOJ.1032.[JSOI2007]祖码(区间DP)
- python 虚拟环境使用