Как начать писать расширение PHP5 в C ++

Я пишу расширение PHP5, и, хотя я мог бы написать его на C, было бы проще использовать C ++ и использовать STL и Boost.

Проблема в том, что учебники, которые я видел, касаются только C, и я ищу базовый пример, который использует C ++

Вот что я пробовал до сих пор:

config.m4

[ --enable-hello Enable Hello World support]) if test "$PHP_HELLO" = "yes"; then AC_DEFINE(HAVE_HELLO, 1, [Whether you have Hello World]) PHP_NEW_EXTENSION(hello, hello.cpp, $ext_shared) fi 

php_hello.h

Обратите внимание на мою попытку объявить биты, с которыми PHP взаимодействует, как extern "C"

 #ifndef PHP_HELLO_H #define PHP_HELLO_H 1 extern "C" { #define PHP_HELLO_WORLD_VERSION "1.0" #define PHP_HELLO_WORLD_EXTNAME "hello" PHP_FUNCTION(hello_world); extern zend_module_entry hello_module_entry; #define phpext_hello_ptr &hello_module_entry } #endif 

hello.cpp

 #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_hello.h" static function_entry hello_functions[] = { PHP_FE(hello_world, NULL) {NULL, NULL, NULL} }; zend_module_entry hello_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif PHP_HELLO_WORLD_EXTNAME, hello_functions, NULL, NULL, NULL, NULL, NULL, #if ZEND_MODULE_API_NO >= 20010901 PHP_HELLO_WORLD_VERSION, #endif STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_HELLO ZEND_GET_MODULE(hello) #endif PHP_FUNCTION(hello_world) { RETURN_STRING("Hello World", 1); } 

…. и вот мои ошибки сборки:

Если я phpize, настрою и сделаю это, я получаю следующее (переформатированное для ясности)

 $ make /bin/bash /home/paul/php5/php-5.2.8/ext/hello2/libtool --mode=compile -I. -I/home/paul/php5/php-5.2.8/ext/hello2 -DPHP_ATOM_INC -I/home/paul/php5/php-5.2.8/ext/hello2/include -I/home/paul/php5/php-5.2.8/ext/hello2/main -I/home/paul/php5/php-5.2.8/ext/hello2 -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -I/usr/local/include/php/ext/date/lib -DHAVE_CONFIG_H -c /home/paul/php5/php-5.2.8/ext/hello2/hello.cpp -o hello.lo libtool: compile: unrecognized option `-I.' libtool: compile: Try `libtool --help' for more information. make: *** [hello.lo] Error 1 

Я подозреваю, что мне нужно больше работать с config.m4, чтобы создать рабочий файл makefile, но я довольно новичок в инструментальной цепочке GCC.

Если это помогает, я только нацеливаю php 5.2.6+ и только на Linux (в частности, Ubuntu 8.04). Моя среда сборки использует Ubuntu 8.10, используя gcc 4.3.2

Указатели с благодарностью получили!

После публикации я столкнулся с CodeGen_PECL, который создает расширение скелета из XML-описания расширения. Это включает в себя тег, который выводит C ++

Кроме того, чтобы файл заголовка использовал extern «C», сгенерированный файл cpp также обеспечивал, что ZEND_GET_MODULE (привет) находится внутри блока «C» extern.

Как и ожидалось, наибольшая разница была в файле m4, который выглядел так:

 dnl dnl $ Id: $ dnl PHP_ARG_ENABLE(hello, whether to enable hello functions, [ --enable-hello Enable hello support]) if test "$PHP_HELLO" != "no"; then PHP_REQUIRE_CXX AC_LANG_CPLUSPLUS PHP_ADD_LIBRARY(stdc++,,HELLO_SHARED_LIBADD) export OLD_CPPFLAGS="$CPPFLAGS" export CPPFLAGS="$CPPFLAGS $INCLUDES -DHAVE_HELLO" AC_MSG_CHECKING(PHP version) AC_TRY_COMPILE([#include <php_version.h>], [ #if PHP_VERSION_ID < 40000 #error this extension requires at least PHP version 4.0.0 #endif ], [AC_MSG_RESULT(ok)], [AC_MSG_ERROR([need at least PHP 4.0.0])]) export CPPFLAGS="$OLD_CPPFLAGS" PHP_SUBST(HELLO_SHARED_LIBADD) AC_DEFINE(HAVE_HELLO, 1, [ ]) PHP_NEW_EXTENSION(hello, hello.cpp , $ext_shared) fi 

Итак, если вы боретесь с той же проблемой, используйте CodeGen_PECL или адаптируйте образец m4 выше (а также убедитесь, что вы использовали extern «C» в своем заголовке и вокруг макроса ZEND_GET_MODULE)

В это приложение quickie также можно включить класс (и экспортировать функции в стиле Class :: Method): http://devzone.zend.com/article/4486

Для меня наиболее полезной частью являются строки для добавления для C ++ компилятора / правила привязки к config.m4 для phpize.