PHP的C扩展如何调用第三方库

wzb198606 2012-06-06 06:40:17
由于本人是写C的所以对这个事情不是很了解,首先说明一下是程序在linux下,php的版本是5.3.13,我用C写的一个简单的加法运算的php扩展是可以使用的,我想问题就出在没有正确的链接进C的库
C库为两种类型:
1.是linux系统本身就自带的,但是需要在gcc编译可执行文件的时候用-l去链接,比如C的线程库 -lpthread

2.是第三方的,比如我现在有一个C的.so动态链接库libdecode.so,提供了一个C的API函数long SetCode(long l_input);

我改写的供php调用的函数是这么写的

PHP_FUNCTION(php_setcode)
{
long arg_1 = 0;
long re = 0;
if(zend_parse_parameter(ZEND_NUM_ARGS() TSRMLS_CC, "l", &arg_1) == FAILURE)
{
return;
}
re = SetCode(arg_1);
}

config.m4里添加了

PHP_ADD_LIBRARY_WITH_PATH(decode, /home/wzb/lib, TEST_SHARED_LIBADD)
PHP_ADD_INCLUDE(/home/wzb/include)

执行命令
./congfigure --with-php-config=/usr/local/php/bin/php-config
make


并把生成的test.so和C的第三方库libdecode.so都复制到了/usr/local/php/lib/php/extension/no-debug-non-zts-20090626下
现在我在php.ini已经添加了如下的语句
extension=test.so
extension=libdecode.so

最后在php里无法成功调用php_setcode的函数

请教上述步骤我哪里需要补充才能实现对php_setcode的调用
...全文
695 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhgflx 2013-10-11
  • 打赏
  • 举报
回复
你好,请问下你那个除了这个地方做了处理之外还在哪个地方做了处理呢,我碰到类似的问题,目前没有办法处理啊
引用 11 楼 wzb198606 的回复:
感谢各位,问题已经解决了,问题应该还是出在config.m4这里。解决方法如下: vi config.m4 再config.m4中添加 PHP_ADD_LIBRARY_WITH_PATH(decode, /home/wzb/lib, TEST_SHARED_LIBADD) PHP_ADD_INCLUDE(/home/wzb/include) PHP_SUBST(TEST_SHARED_LIBADD) 然后依次执行命令 phpize ./configure --enable-test --with-php-config=/usr/local/php/bin/php-config make 最后在modules得到的PHP的扩展库test.so,可以实现对libdecode.so的C的API函数的调用
  • 打赏
  • 举报
回复
#清除
make clean

#添加模块ncdocxml
./configure --with-php-config=/usr/nc-home/php5/bin/php-config --enable-ncdocxml

#编译模块ncdocxml
make LDFLAGS=-lncdocxml
craboy1 2012-06-07
  • 打赏
  • 举报
回复
到你生成的自定义扩展的父目录下,应该是ext目录吧。看看其实扩展是怎么实现的,比如mysql
qq120848369 2012-06-07
  • 打赏
  • 举报
回复
咱不懂, 网上找个教程折腾折腾吧, 从原理角度, php得包含头文件, 执行时得dl系列动态加载动态库内的接口, 你需要告诉php有哪些接口是你动态库暴漏出来的.
xuzuning 2012-06-07
  • 打赏
  • 举报
回复
这与是否是 php 扩展并无关系

你只需知道如何在 c 程序中连接 so 即可
这不是 php 的问题,请到 C/C++ 版面求解,那里高人很多
wzb198606 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

你想实现c处理功能还是就是想让php调用自定义函数,若是后者为啥不做成php扩展呢
若是前者:http://blog.csdn.net/franzhong/article/details/7265429
[/Quote]
是这样子的,libdecode.so不是我写的库,是由第三方提供的C库,我就是准备写一个PHP扩展来调用这个C库,编译都没有问题,就是差最后一步,知道如何把这个第三方库给链进来。我并没有libdecode.so这个库的源代码.c文件
wzb198606 2012-06-07
  • 打赏
  • 举报
回复
感谢各位,问题已经解决了,问题应该还是出在config.m4这里。解决方法如下:
vi config.m4
再config.m4中添加
PHP_ADD_LIBRARY_WITH_PATH(decode, /home/wzb/lib, TEST_SHARED_LIBADD)
PHP_ADD_INCLUDE(/home/wzb/include)
PHP_SUBST(TEST_SHARED_LIBADD)

然后依次执行命令
phpize
./configure --enable-test --with-php-config=/usr/local/php/bin/php-config
make

最后在modules得到的PHP的扩展库test.so,可以实现对libdecode.so的C的API函数的调用
wzb198606 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
你说的那是静态加载,你只有 so 没有对应的 lib 文件和头文件。是不可能实现静态加载的
你需要的是动态加载,这当然是在c程序里完成的。比如 window 下的 BC 就有 LoadLibrary 函数来加载指定的 dll,当然没有头文件也还是很痛苦的

另外我们在 vb、vfp 中都一直通过动态加载操作系统的动态链接库来完成脚本语言不可能完成的工作
[/Quote]
当然头文件是有的,不然就不会编译成功了,关于这个动态加载的问题,其实生成可执行程序时有-ldl这个编译选项,最终会涉及到需要在php去链接这个libdl.so这个linux系统自带的动态库,就是把我上述的问题从libdecode.so换成了libdl.so
还是非常感谢你的热心帮助
xuzuning 2012-06-07
  • 打赏
  • 举报
回复
帮你找了这篇博文供参考 http://blog.csdn.net/offbye/article/details/6832536
xuzuning 2012-06-07
  • 打赏
  • 举报
回复
你说的那是静态加载,你只有 so 没有对应的 lib 文件和头文件。是不可能实现静态加载的
你需要的是动态加载,这当然是在c程序里完成的。比如 window 下的 BC 就有 LoadLibrary 函数来加载指定的 dll,当然没有头文件也还是很痛苦的

另外我们在 vb、vfp 中都一直通过动态加载操作系统的动态链接库来完成脚本语言不可能完成的工作
wzb198606 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

这与是否是 php 扩展并无关系

你只需知道如何在 c 程序中连接 so 即可
这不是 php 的问题,请到 C/C++ 版面求解,那里高人很多
[/Quote]
在C里面链接动态库是在最后生成可执行程序时(相当于windows下的.exe)链接的,这时候的问题就是最后可执行程序是PHP而不是C,所以最后一步链接.so并非由C来完成
franzhong 2012-06-06
  • 打赏
  • 举报
回复
你想实现c处理功能还是就是想让php调用自定义函数,若是后者为啥不做成php扩展呢
若是前者:http://blog.csdn.net/franzhong/article/details/7265429

20,397

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧