基于ARM11的PHP动态扩展库环境的搭建_第1页
基于ARM11的PHP动态扩展库环境的搭建_第2页
基于ARM11的PHP动态扩展库环境的搭建_第3页
基于ARM11的PHP动态扩展库环境的搭建_第4页
基于ARM11的PHP动态扩展库环境的搭建_第5页
已阅读5页,还剩12页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于ARM11的PHP动态扩展库环境的搭建文件编号程序版本起草人审核人批准人分发号密级机密受控状态受控受控期限永久起草日期20111215审核日期批准日期分发日期基于ARM11的PHP动态扩展库环境的搭建嵌入式开发II文档控制记录序号修改状态修改内容修改人完成时间V10创建文档20111213目录文档控制记录II1引言12搭建步骤及相关说明221概述222学习文档222搭建步骤23主要问题71、动态库的三个不同名字及含义72、如何实现动态库FTPARM11103、ARM11环境下动态库无法加载13基于ARM11的PHP动态扩展库环境的搭建嵌入式开发1/171引言目的本文档旨在约束ARM11在嵌入式下的WEB开发过程,主要针对PHP扩展库的撰写,不包括WEB本身的框架设计和搭建。约束PHP脚本调用PHP扩展库,扩展库封装开发板动态库的方式对象嵌入式WEB开发的界面设计人员、PHP库接口封装人员、C库封装人员参考文档STMATMV30嵌入式WEBPHP扩展库设计20110727PHP扩展LIUNX开发学习文档ARM下PHP动态库如何加载HTMLPHP动态库HTML动态库SONAMEHTMLFTP相关命令HTML基于ARM11的PHP动态扩展库环境的搭建嵌入式开发2/172搭建步骤及相关说明21概述本次基于ARM11的动态扩展库环境的搭建,用了将近一周半的时间才收尾,中途遇到大量的问题,并且有些问题的解决方法出乎常理逻辑,通过一些特殊手段和方法才得以解决,后面会一一列出解决方法和相关注意事项22学习文档此次ARM11动态库环境的搭建需优先参考STMATMV30嵌入式WEBPHP扩展库设计20110727、LIUNX开发学习文档其中的动态库制作部分、PHP扩展;参照以上几个文档虽可以搭建出一个基本框架,但是在ARM11环境下很多问题便一一暴露,加上网络上资源有限,很多问题都是靠反复验证才得以解决,最终搭建出支持动态库加载的配置环境。22搭建步骤1、所需软件已搭建好,能够实现网页制作的APACHEPHP、ARMLINUXGCC交叉编译环境,具体详见基于S3C6410的WEB开发环境的搭建杨洪。2、搭建具体步骤为1制作第三方动态库SO扩展库2制作PHP动态扩展库3、制作第三方动态库SO扩展库编写源函数,保存为HELLOTESTCINCLUDEINCLUDEINTHELLO_ADDINTA,INTBRETURNAB编写头文件函数的声明,保存为HELLOTESTHINTHELLO_ADDINTA,INTB测试代码TESTCINCLUDEINCLUDEINCLUDE“HELLOTESTH”基于ARM11的PHP动态扩展库环境的搭建嵌入式开发3/17INTMAINVOIDINTNRET0NRETHELLO_ADD2,5PRINTF“HELLO_ADD2,5DN”,NRETRETURN0交叉编译生成动态链接库SO;后面会对此做详细介绍,此处不再累赘,注意动态库的三个不同的名字LINK_NAME,SO_NAME,REAL_NAME。此处采用MAKEFILE的方式,这样编译C程序以及对其修改会方便很多,其中的符号可以查看相关书籍,此处不再做介绍最后编译完结果会在文件下出现HELLOTESTCHELLOTESTHHELLOTESTOLIBHELLOTESTSOLIBHELLOTESTSO1LIBHELLOTESTSO100其中的箭头符号为所建立的链接基于ARM11的PHP动态扩展库环境的搭建嵌入式开发4/17相关MAKEFILE测试动态库,超级用户下,拷贝SO库函数到板卡的/LIB目录下,编写测试代码进行测试,I库头文件路径,L库文件路径,L库的链接ROOTYANGHONGLIBHELLOTESTCPLIBHELLOTESTSO1/LIB/ROOTYANGHONGLIBHELLOTESTCPTEST/LIB/在板卡上运行/TEST可看到显示结果HELLO_ADD2,57,则证明第三方SO是无误的。下面是如何将SO编译进PHP扩展库。基于ARM11的PHP动态扩展库环境的搭建嵌入式开发5/174、制作PHP扩展库对这部分内容,对原理不清楚,可参照文档STMATMV30嵌入式WEBPHP扩展库设计20110727,此处纯粹给出操作性的指导。自动构建系统,在PHP源码/USR/LOCAL/APACHEARM11/PHP448/EXT执行如下操作YANGHONGYANGHONGEXT/EXT_SKELEXTNAMETEST会出现上面的配置界面,并且自动生成CONFIGM4、PHP_TETSH、TESTC等几个文件,依次做如下修改1修改CONFIGM4文件,去掉DNL,此处推荐使用ENABLEPHP_ARG_ENABLETEST,WHETHERTOENABLETESTSUPPORT,MAKESURETHATTHECOMMENTISALIGNEDENABLETESTENABLETESTSUPPORTIFTEST“PHP_TEST“NO“THEN2修改PHP_TETSH文件PHP_FUNCTIONCONFIRM_TEST_COMPILED/FORTESTING,REMOVELATER/PHP_FUNCTIONPHP_HELLO_ADD3修改TESTC文件修改处1ZEND_FUNCTION_ENTRYTEST_FUNCTIONSPHP_FECONFIRM_TEST_COMPILED,NULL/FORTESTING,REMOVELATER/基于ARM11的PHP动态扩展库环境的搭建嵌入式开发6/17PHP_FEPHP_HELLO_ADD,NULLNULL,NULL,NULL/MUSTBETHELASTLINEINTEST_FUNCTIONS/修改处2PHP_FUNCTIONPHP_HELLO_ADDLONGINTA,BLONGINTRESULTIFZEND_PARSE_PARAMETERSZEND_NUM_ARGSTSRMLS_CC,“LL“,RESULTHELLO_ADDA,BRETURN_LONGRESULT其中,PHP_HELLO_ADD为PHP脚本可直接调用的扩展函数。扩展模块编译YANGHONGYANGHONGPHP448CDEXT/TESTYANGHONGYANGHONGTEST/USR/LOCAL/PHP/BIN/PHPIZEYANGHONGYANGHONGTESTCCARMLINUXGCC/CONFIGUREHOSTARMLINUXWITHPHPCONFIG/USR/LOCAL/APACHEARM11/PHP/BIN/PHPCONFIGENABLETESTYANGHONGYANGHONGTESTMAKELDFLAGSLHELLOTESTYANGHONGYANGHONGTESTMAKEINSTALLINSTALLINGSHAREDEXTENSIONS/USR/LOCAL/APACHEARM11/PHP/LIB/PHP/EXTENSIONS/NODEBUGNONZTS20020429/到此为止,一个PHP扩展库编写成功下面进行测试拷贝PHP扩展库到开发板的扩展库目录下YANGHONGYANGHONGTESTCP/USR/LOCAL/APACHEARM11/PHP/LIB/PHP/EXTENSIONS/NODEBUGNONZTS20020429/TESTSO/USR/LOCAL/APACHEARM11/PHP/LIB/PHP/EXTENSIONS/拷贝第三方SO到板卡的/LIB或者/USR/LIB下YANGHONGYANGHONGTESTCPLIBHELLOTESTSO1/LIB/注意后面的目录依次为开发板上对应的文件系统的目录基于ARM11的PHP动态扩展库环境的搭建嵌入式开发7/17编写PHP测试代码“测试结果,显示为所需要的结果。3主要问题1、动态库的三个不同名字及含义参考动态库SONAMEHTML第一个是共享库本身的文件名(REALNAME),其通常包含版本号,常常是是这样LIBMATHSO111234。LIB是LINUX上的库的约定前缀,MATH是共享库名子,SO是共享库的后缀名,111234的是共享库的版本号,其主版本号小版本号BUILD号。主板号,代表当前动态库的版本,如果动态库的接口有变化,那么这个版本号就要加1;后面的两个版本号(小版本号和BUILD号)是告诉你详细的信息,比如为一个HOTFIX而生成的一个版本,其小版本号加1,BUILD号也应有变化。这个文件名包含共享库的代码。第二个是动态库的SONAME(SHORTFORSHAREDOBJECTNAME),其是应用程序加载DLL时候,其寻找共享库用的文件名。其格式为LIBMATHSOMAJORVERSIONNUMBER其只包含MAJORVERSIONNUMBER,换句话说,也就是只要其接口没有变,应用程序都可以用,不管你其后MINORBUILDVERSIONORBUILDVERSION。问题来了,程序运行时怎么通过SONAME找个REALNAMESONAME存在哪里如果与REALNAME关联起来什么时候存的这就是接下来要介绍的第三个共享库的名字,LINKNAME,顾名思义,就是在编译过程,LINK阶段用的文件名。其将SONMAE和REALNAME关联起来。第三个名字,共享库的连接名(LINKNAME),是专门为BUILD阶段连接而用的名字。这个名字就是LIBMATHSO,比如LIBMATHSO。其是不带任何版本信息的。在共享库编译过程中,连接(LINK)阶段,编译器将生成一个共享库及REAL基于ARM11的PHP动态扩展库环境的搭建嵌入式开发8/17NAME,同时将共享库的SONAME,写在共享库文件里的文件头里面。可以用命令READELFDSHARELIBRARY去查看。在应用程序引用共享库时,其会用到共享库的LINKNAME。在应用程序的LINK阶段,其通过LINK名字找到动态库,并且把共享库的SONAME提取出来,写在自己的共享库的头里面。当应用程序加载时候就会通过SONAME去在给定的路径下寻找该共享库。在本程序中也做了三个动态库LIBHELLOTESTSO100REALNAME、LIBHELLOTESTSO1SONAME、LIBHELLOTESTSOLINKNAME,正如MAKEFILE注释里面强调的NOTE本机只做进行链接时需要的LIBHELLOTESTSO,所以LIBHELLOTESTSO1到ARM开发板上装载时再做符号链接(也可直接将做好链接后的LIBHELLOTESTSO1拷贝过去,也能成功使用)并且本机链接前需要把LIBHELLOTSTSO100先拷贝的根目录的LIB/下,链接的时候才会去链接交叉编译器对应目录的动态库原因未知,且出乎寻常逻辑然后将链接时必须的LIBHELLOTESTSO拷贝的交叉编译器的对应目录下进行动态链接否则会生成默认的静态库,具体原因未知。如果不优先将LIBHELLOTESTSO100拷贝到根目录下的LIB/下,会默认生成静态库,可能是交叉编译器的影响,如下所示基于ARM11的PHP动态扩展库环境的搭建嵌入式开发9/17并会出现以下警告从提示看出应该是链接工具LIBTOOL没有找到对应的动态库,将LIBHELLOTEST100(REALNAME),拷贝至根目录下的LIB/下,再进行MAKELDFLAGSLHELLOTEST出现上面的错误,似乎链接工具正确去链接了动态库的位置。为了寻找链接工具究竟链接的是哪个目录下的动态库,此处花费了大量的时间和精力去寻找。特别注意最终发现链接目录在交叉编译环境下的/OPT/FRIENDLYARM/TOOLSCHAIN/451/ARMNONELINUXGNUEABI/LIB/将LIBHELLOTESTSOLINKNAME拷贝至此目录下,再重新MAKELDFLAGSLHELLOTEST基于ARM11的PHP动态扩展库环境的搭建嵌入式开发10/17由此可知成功编译出动态库,然后再执行MAKEINSTALL则动态库成功的安装到了此目录下/USR/LOCAL/APACHEARM11/PHP/LIB/PHP/EXTENSIONS/NODEBUGNONZTS20020429/2、如何实现动态库FTPARM11参考FTP相关命令HTML制作好的动态库TESTSO及LIBHELLOTESTSO1SONAME,可以采取U盘,SD卡,FTP的方式转存到开发板上进行调试,此处采取一种比较合理的方法FTP传输,但是传输到ARM11上以后需要修改相应权限才能进行访问,这个与U盘和SD卡直接拷贝方式不同其实如果能用SSH和SCP就更好了,但是似乎ARM11的文件系统不支持。FTP相关命令说明服务器有安装FTPSERVER,另外一台LINUX可以使用FTP的CLIENT程序来进行文件的拷贝读取和下载。1连接FTP服务器格式FTPHOSTNAME|IPADDRESSA)在LINUX命令行下输入FTP1921682666B)服务器询问你用户名和口令,分别输入用户名和相应密码,待认证通过即可。2下载文件下载文件通常用GET和MGET这两条命令。A)GET格式GETREMOTEFILELOCALFILE将文件从远端主机中传送至本地主机中。如要获取服务器上EOSE1BMP,则FTPGET/ROSE/1BMP1BMP(回车)B)MGET格式MGETREMOTEFILES从远端主机接收一批文件至本地主机。如要获取服务器上EOSE下的所有文件,则FTPCD/ROSEFTPMGET(回车)注意文件都下载到了LINUX主机的当前目录下。比如,在/ROOT/YINT下基于ARM11的PHP动态扩展库环境的搭建嵌入式开发11/17运行的FTP命令,则文件都下载到了/ROOT/YINT下。3上传文件A)PUT格式PUTLOCALFILEREMOTEFILE将本地一个文件传送至远端主机中。如要把本地的1BMP传送到远端主机EOSE,并改名为333BMPFTPPUT1BMP/ROSE/333BMP(回车)B)MPUT格式MPUTLOCALFILES将本地主机中一批文件传送至远端主机。如要把本地当前目录下所有BMP文件上传到服务器EOSE下FTPCD/ROSE(回车)FTPMPUTBMP(回车)注意上传文件都来自于主机的当前目录下。比如,在/ROOT/TEST下运行的FTP命令,则只有在/ROOT/TEST下的文件LINUX才会上传到服务器EOSE下。4断开连接BYE中断与服务器的连接。FTPBYE(回车)操作实例如下找到对应的你要放置文件的位置传输第三方C库LIBHELLOTESTSO1基于ARM11的PHP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论