VisualGDB_VS2010_开发PHP扩展
1、新建一个Linux项目
2、选择项目类型为:Shared Library
3、创建一个远程项目
4、完成
5、解决方案删除这两个文件
6、去php源码包的ext目录里生成一个php扩展框架,并拷贝两个文件:xxxx.c文件和xxxx.h头文件
使用命令:./ext_skel --extname=extension1
把这两个文件从虚拟机拿到开发环境来,并添加到项目里去
拷贝到项目目录去
再把这两个文件添加到项目里
可以直接拖进去或者添加现有项或者是复制粘贴都可以
接下来会提示找不到某些头文件,不用担心,我们可以设置头文件目录
在配置对话框选择:MakeFile Settings
添加包含目录
添加头文件目录如下:点+ 添加
然后点OK 再Apply
再OK 就可以了
在目录的外部依赖项可以看到我们添加的头文件
一切准备工作就序,可以先编译试试
我们可以看到编译时没有错误的
也生成了相应的so共享库文件
然后我们可以尝试在扩展源文件写点东西,我用的是VS2010,开发这个很方便,有强大的智能提示
好,重点来了,现在我们可以试着去把我们刚才编译的文件加入到php.ini中的 extension中看看效果
因为我们刚才建立的是远程项目,所以在自己的虚拟机中可以找到这个项目目录:
当然这个目录可以自定义,大家可以去试试
接下来,我们进这个项目目录看看
源文件什么的都在我们编译的时候自动上传到了这个远程目录里,然后呢,我们的so文件在 Debug目录里,因为我们在VS中的项目类型是Debug版本的
我们已经看到了这个so文件,那接下来我们要试着去把这个so文件复制到php的extension目录中去
我这边的路径是:/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718
接下来cp吧
OK,文件已经成功复制过了
接下来我们把这个库文件添加到php.ini中
保存,然后重启php-fpm看看效果吧。
重点来了,我们会看到一个提示: PHP Startup: Invalid library (maybe not a PHP library) 'Extension1.so' in <b>Unknown</b>
意思就是我们刚才编译的so文件不是一个php扩展,为什么呢?我们用的也是php为我们生成的代码,还有什么不对呢?那么接下来,
咱们去php源码找寻下答案吧
我们可以通过搜索 刚才那个提示的 字符串 很容易找到 那个输出错误信息的 源文件 在 php-7.2.28\ext\standard\dl.c 中的 195行
那么是什么原因呢?我们可以通过阅读代码,得知:
首先,会加载我们刚才的so文件
得到一个内核对象,所谓的句柄的玩意儿,不晓得句柄的无所谓,反正你晓得这个是后续我们要操作这个so文件的一把钥匙就行了
接下来是一顿判断操作,没有问题就会去执行这个地方:
这个意思是调用我那个so文件导出的一个方法:get_module,
然后返回一个结构体指针,这个结构体是:_zend_module_entry。
晓得原因就好办了,所以我们可以去我们刚才那个扩展的源文件看看有没有这样的方法,我们找遍了源文件,只发现这个:
也就是我们没有去调用这个:ZEND_GET_MODULE(extension1),而这个要调用的话是需要通过一个宏来控制的
那怎么才能调用呢?很简单,我们只需要在编译的时候加上宏就可以了:
双击打开:
我们可以加上这个宏:
再次编译,我们可以看到编译成功
我们自定义宏也加上了
gcc -ggdb -ffunction-sections -O0 -DCOMPILE_DL_EXTENSION1 -I/root/php-7.2.28 -I/root/php-7.2.28/ext -I/root/php-7.2.28/ext/date/lib -I/root/php-7.2.28/main -I/root/php-7.2.28/TSRM -I/root/php-7.2.28/Zend -DDEBUG=1 -fPIC -c extension1.c -o Debug/extension1.o -MD -MF Debug/extension1.dep
咱们再次去测试下我们新生成的so库文件,看看这次能不能成功。
重复第一次的步骤,把so文件拷贝到/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718,然后重启php-fpm 看看
这一次,php-fpm 没有给我们提示其他我们不想看到的信息,好,接下来,咱们用php -m 看看有没有加入咱们的扩展
这一次,我们的扩展库成功加入到了php豪华套餐组合,哈哈哈
VisualGDB_VS2010_开发PHP扩展的更多相关文章
- 手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单
手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩 ...
- Sublime Text 前端开发常用扩展插件推荐
Sublime Text 前端开发常用扩展插件推荐 Sublime Text Sublime Text 是程序员们公认的编码神奇,拥有漂亮的用户界面和强大的功能 更重要的是,Sublime Text ...
- 【翻译】我钟爱的Visual Studio前端开发工具/扩展
原文:[翻译]我钟爱的Visual Studio前端开发工具/扩展 怎么样让Visual Studio更好地编写HTML5, CSS3, JavaScript, jQuery,换句话说就是如何更好地做 ...
- 最锋利的Visual Studio Web开发工具扩展:Web Essentials详解
原文:最锋利的Visual Studio Web开发工具扩展:Web Essentials详解 Web Essentials是目前为止见过的最好用的VS扩展工具了,具体功能请待我一一道来. 首先,从E ...
- 开发 chrome 扩展 GitHub-Remarks 的一些想法以及遗憾
前文 对于单页应用中如何监听 URL 变化的思考 说到我在开发 chrome 扩展 GitHub Remarks 中遇到的一个问题,本文来聊聊开发这个扩展的前后心路历程. 为什么开发这个扩展?前文说到 ...
- 手把手教你开发chrome扩展
转载:http://www.cnblogs.com/walkingp/archive/2011/04/04/2003875.html 手把手教你开发chrome扩展一:开发Chrome Extenst ...
- 【逆向知识】开发WinDBG扩展DLL
如何开发WinDbg扩展DLL WinDbg扩展DLL是一组导出的回调函数,用于实现用户定义的命令.以便从内存转储中提取特定的信息.扩展dll由调试器引擎加载,可以在执行用户模式或内核模式调试时提供自 ...
- 如何开发 Laravel 扩展包并发布到 Composer
如何开发 Laravel 扩展包并发布到 Composer 发布于 2019-01-22 cxp1539 1074 Vie 开发扩展包 我们来做一个根据第一个字符或者汉字生成头像的larave ...
- windows下开发PHP扩展dll(无需Cygwin)
windows下开发php扩展网上很多资料都说需要Cygwin,其实完全可以不必安装该东东.没错,是可以在linux下生成骨架后拷到windos下来用,但是,如果没有linux环境呢?什么,装虚拟机? ...
随机推荐
- 开始 nx
官网 video 详解Nx, 必读 配置代理 每次创建lib都要重启编辑器 创建项目 选择empty,然后选择Angular CLI 因为可以使用Angular Console λ npm init ...
- Baccarat是如何运用去中心化治理模式的?
区块链的出现,让大家看到了去中心化的可能.去中心化的数字资产从最初的默默无闻,一路起起伏伏发展了十年,逐渐成为了大众认可的价值存储方式.去中心化的金融,使数字资产的生态建设者意识到,即使没有中心化的金 ...
- C语言数据类型思维导图
- go-admin在线开发平台学习-2[程序结构分析]
紧接着上一篇,本文我们对go-admin下载后的源码进行分析. 首先对项目所使用的第三方库进行分析,了解作者使用的库是否是通用的官方库可以有助于我们更快地阅读程序.接着对项目的main()方法进行分析 ...
- idea更改包名无法加载主类解决
把工程下面的.idea目录下的workspace.xml里面的路径改成你最新的路径即可. <option name="SPRING_BOOT_MAIN_CLASS" valu ...
- PAT-1066(Root of AVL Tree)Java语言实现
Root of AVL Tree PAT-1066 这是关于AVL即二叉平衡查找树的基本操作,包括旋转和插入 这里的数据结构主要在原来的基础上加上节点的高度信息. import java.util.* ...
- PAT-1043(Is It a Binary Search Tree)JAVA实现
Is It a Binary Search Tree PAT-1043 主要涉及到根据前序遍历序列片段是否是一颗二叉树,这里有一个小tip就是插入序列就是二叉树的前序遍历序列. 第二个是会对排序二叉树 ...
- PBR:基于物理的渲染(Physically Based Rendering)+理论相关
一: 关于能量守恒 出射光线的能量永远不能超过入射光线的能量(发光面除外).如图示我们可以看到,随着粗糙度的上升镜面反射区域的会增加,但是镜面反射的亮度却会下降.如果不管反射轮廓的大小而让每个像素的镜 ...
- MVC base64加密的文件,前端下载
后端代码: public FileResult OutPutFile(string base64file,string filename) { buffer = Convert.FromBase64 ...
- Hi3559AV100 NNIE开发(3)RuyiStudio软件 .wk文件生成过程-mobilefacenet.cfg的参数配置
之后随笔将更多笔墨着重于NNIE开发系列,下文是关于Hi3559AV100 NNIE开发(3)RuyiStudio软件 .wk文件生成过程-mobilefacenet.cfg的参数配置,目前项目需要对 ...