gpt4 book ai didi

php - 如何在 Zend PHP 扩展中连接外部 C/C++ 库

转载 作者:太空宇宙 更新时间:2023-11-04 02:53:15 24 4
gpt4 key购买 nike

我正在尝试使用 Zend 框架制作一个用 C 语言编写的 .so PHP 扩展。使用独立扩展一切正常。但是,如果我尝试在我的扩展中使用其他一些动态链接库,则会出现以下错误:

PHP Warning:  dl(): Unable to load dynamic library '/usr/lib/php5/20121212/test.so' - /usr/lib/php5/20121212/test.so: undefined symbol: _Z5hellov in /var/www/test.php on line 2
PHP Fatal error: Call to undefined function my_function() in /var/www/test.php on line 3

我已经编译好了libhello.so复制到同目录/usr/lib/php5/20121212/我如何从 test.so 模块中使用它?

这是源代码:

测试.c:

#include "php.h"
#include "hello.h"

ZEND_FUNCTION( my_function );
ZEND_FUNCTION(Hello);

zend_function_entry firstmod_functions[] =
{
ZEND_FE(my_function, NULL)
ZEND_FE(Hello, NULL)
{NULL, NULL, NULL}
};

zend_module_entry firstmod_module_entry =
{
STANDARD_MODULE_HEADER,
"First Module",
firstmod_functions,
NULL,
NULL,
NULL,
NULL,
NULL,
NO_VERSION_YET,
STANDARD_MODULE_PROPERTIES
};

ZEND_GET_MODULE(firstmod)

ZEND_FUNCTION( my_function )
{
char *str; int str_len;
long l;
if(ZEND_NUM_ARGS() != 2) WRONG_PARAM_COUNT;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl",
&str, &str_len, &l) == FAILURE) {
return;
}

zend_printf("%s \r\n", str);
zend_printf("%ld \r\n", l);

RETURN_LONG(1);

}

ZEND_FUNCTION (Hello) {
hello();
}

你好.h:

#include <stdio.h>

void hello();

你好.c:

#include "hello.h"

void hello () {
printf("%s\n", "Hello, world!");
}

测试.php:

<?php
dl("test.so");
my_function("123",12);
Hello();
?>

最佳答案

为了让一个函数对 php userland 可见,你需要使用宏 PHP_FUNCTION():

你好.h:

PHP_FUNCTION(hello_world);

测试.c:

ZEND_BEGIN_ARG_INFO_EX(arginfo_hello_world, 0, 0, 2)
ZEND_ARG_INFO(0, arg1_name)
ZEND_ARG_INFO(0, arg2_name)
ZEND_END_ARG_INFO()


...


const zend_function_entry pcap_functions[] = {
...
PHP_FE(my_function, arginfo_hello_world)
...
};


...
PHP_FUNCTION( my_function )
{
char *str; int str_len;
long l;
if(ZEND_NUM_ARGS() != 2) WRONG_PARAM_COUNT;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl",
&str, &str_len, &l) == FAILURE) {
return;
}

zend_printf("%s \r\n", str);
zend_printf("%ld \r\n", l);

RETURN_LONG(1);

}

...

关于php - 如何在 Zend PHP 扩展中连接外部 C/C++ 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20002874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com