Работа С C++ Библиотекой Из Php Расширения

  • Автор темы evilive
  • Дата начала
E

evilive

#1
Доброго всем времени суток!

Проблема в следующем: есть простейшее PHP расширение, написанное на С++, в которой происходит вызов функции из внешней библиотеки , также написанной на С++. При вызове функции в PHP, выводится ошибка: "Fatal error: Call to undefined function mul() in C:\Apache2.2\htdocs\phpinfo.php on line 3".

Общая схема такая:
PHP: echo mul(5, 4); -> PHP Extension: PHP_FUNCTION(mul) -> DLL: Math::Mul()

Вот вызов функции в PHP:

PHP:
<?php 
echo mul(5, 4);
?>
Здесь экстеншен:

C++:
#include "stdafx.h"
using namespace MathFuncs;

PHP_FUNCTION(sum);
PHP_FUNCTION(mul);

const zend_function_entry test_functions[] = {
PHP_FE(sum, NULL)
PHP_FE(mul, NULL)
{NULL, NULL, NULL}
};

zend_module_entry test_module_entry = {
STANDARD_MODULE_HEADER,	  // #if ZEND_MODULE_API_NO >= 20010901
"test_ext",				  // название модуля
test_functions,			  // указываем экспортируемые функции
NULL,						 // PHP_MINIT(test), Module Initialization
NULL,						 // PHP_MSHUTDOWN(test), Module Shutdown
NULL,						 // PHP_RINIT(test), Request Initialization
NULL,						 // PHP_RSHUTDOWN(test), Request Shutdown
NULL,						 // PHP_MINFO(test), Module Info (для phpinfo())
"0.1",						// версия нашего модуля
STANDARD_MODULE_PROPERTIES
};

ZEND_GET_MODULE(test)

PHP_FUNCTION(sum)
{
int a, b;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b))
return;

RETURN_LONG(a+b);
}

PHP_FUNCTION(mul)
{
double a, b;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "dd", &a, &b))
return;

RETURN_DOUBLE(Math::Mul(5, 6));
}
И библиотека, заголовок:

C++:
namespace MathFuncs
{
class Math
{
public:
static __declspec(dllexport) double Mul(double a, double b);

static __declspec(dllexport) double Div(double a, double b);
};
}
и тело:
C++:
#include "test.h"
#include <stdexcept>

using namespace std;

namespace MathFuncs
{

double Math::Mul(double a, double b)
{
return a * b;
}

double Math::Div(double a, double b)
{
if(b == 0)
{
throw new invalid_argument("b cannot be zero!");
}
return a / b;
}
}
В чем может быть дело?