Я хотел бы создать * .so, затем сделать его модулем расширения PHP и вызывать функции в * .so через PHP.
Мой шаг, как показано ниже:
Создайте библиотеку C под Linux, сначала создайте hello.c
int hello_add(int a, int b)
{
return a+b;
}
Затем постройте, как показано ниже:
gcc -O -c -fPIC -o hello.o hello.c
gcc -shared -o libhello.so hello.o
скачать исходный код php 5.2.17
tar -zxvf php.5.2.17.tar.gz
CD php.5.2.17
./ configure ./configure —prefix = / home / user1 / php-5.2.17
делать & сделать установку
CD Ext;
./ ext_skel —extname = привет
CD привет
отредактируйте config.m4, удалив dnl в строке 16-18, затем сохраните и выйдите.
16: PHP_ARG_ENABLE(hello, whether to enable hello support,
17: dnl Make sure that the comment is aligned:
18: [ --enable-hello Enable hello support])
выполните команду: /home/user1/php-5.2.17/bin/phpize
откройте php_hello.h, добавьте
PHP_FUNCTION(hello_add);
открыть hello.c изменить на:
zend_function_entry hello_functions[] = {
PHP_FE(confirm_hello_compiled, NULL) /* For testing, remove later. */
PHP_FE(hello_add, NULL) /* For testing, remove later. */
{NULL, NULL, NULL} /* Must be the last line in hello_functions[] */
};
В конце файла добавьте
PHP_FUNCTION(hello_add)
{
long int a, b;
long int result;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) {
return;
}
result = hello_add(a, b);
RETURN_LONG(result);
}
./configure --with-php-config=/home/usr1/php-5.2.17/bin/php-config
make LDFLAGS=-lhello
Затем hello.so создается в /home/usre/php-5.2.17/ext/hello/modules, но
использование nm hello.so
это печатает:
`U hello_add
0000000000000a98 T _init`
Создайте php-файл для тестирования:
<?php
if(!dl('btest.so'))
{
echo "can not load hello.so";
}
else
{
echo "load is done";
echo hello_add(3,4);// here it will throw error in the log
}
?>
в журнале жалуется
[28-Sep-2014 18:38:28] Неустранимая ошибка PHP: вызов неопределенной функции hello_add () ….
Кстати, я скопировал hello.so в другую среду LAMP, не используя PHP, только для сборки. Обе версии 5.2.17.
Кто-нибудь может указать, что происходит?
В то время как в шаге 15 измените LDFLAGS = lhello на LDFLAGS = hello.o, тогда это работает. Я не знаю, что не так с * .so. Во всяком случае, это сейчас исправлено.
Я попытался —with-hello = DIR, что такое DIR? путь к libhello.so или расширение php — путь hello?