【问题标题】:How to connect external C/C++ libraries in Zend PHP extension如何在 Zend PHP 扩展中连接外部 C/C++ 库
【发布时间】:2013-11-28 22:51:05
【问题描述】:

我正在尝试使用 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 模块中使用它?

这里是源代码:

test.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!");
}

test.php:

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

【问题讨论】:

    标签: php c php-internals


    【解决方案1】:

    为了使函数对 php 用户域可见,您需要使用宏 PHP_FUNCTION():

    你好.h:

    PHP_FUNCTION(hello_world);
    

    test.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);
    
    }
    
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 2022-01-14
      相关资源
      最近更新 更多