Как говорит Ремус , вы можете расширить PHP с помощью C / C ++, используя Zend API. Связанное руководство Сара Големона является хорошим началом, и книга Расширение и внедрение PHP того же автора освещает эту тему гораздо более подробно.
Тем не менее, стоит отметить, что оба из них (и в значительной степени все остальное, что я нашел в Интернете) фокусируются на C и не затрагивают некоторые хитрости, необходимые для работы расширений C ++.
В файле config.m4
вам необходимо явно указать стандартную библиотеку C ++:
PHP_REQUIRE_CXX()
PHP_ADD_LIBRARY(stdc++, 1, PHP5CPP_SHARED_LIBADD)
Любая проверка компиляции библиотеки C ++ в файле config.m4
также потребует ссылки на C ++ lib:
PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,,
[
AC_MSG_ERROR([lib $LIBNAME not found.])
],[
-lstdc++ -ldl
])
РЕДАКТИРОВАТЬ - и вот как указать g ++:
И последнее, и не в последнюю очередь, чтобы при компиляции расширения выбирать компилятор / компоновщик C ++, а не компилятор C, параметр 6th для PHP_NEW_EXTENSION()
должен быть "yes"
. то есть:
PHP_NEW_EXTENSION(your_extension,
your_extension.cpp,
$ext_shared,
,
"-Wall -Werror -Wno-error=write-strings -Wno-sign-compare",
"yes")
Из руководства по системе сборки PHP параметры:
- Название расширения
- Список всех исходных файлов, являющихся частью расширения.
- (необязательно)
$ext_shared
, значение, которое было определено при настройке при вызове PHP_ARG_WITH () для
- (необязательно) «Класс SAPI», используется только для расширений, для которых конкретно требуются SAPI CGI или CLI. Во всех остальных случаях его следует оставить пустым.
- (необязательно) Список флагов, добавляемых в CFLAGS при создании расширения.
- (необязательно) Булево значение, которое, если "да", заставит все расширение быть построенным с использованием $ CXX вместо $ CC.
Я не мог понять, как заставить скрипт configure установить g ++ в качестве компилятора / компоновщика вместо gcc, поэтому в итоге я взломал Makefile с помощью команды sed, чтобы выполнить замену поиска в моем скрипте сборки bash:
phpize
./configure --with-myextension
if [ "$?" == 0 ]; then
# Ugly hack to force use of g++ instead of gcc
# (otherwise we'll get linking errors at runtime)
sed -i 's/gcc/g++/g' Makefile
make clean
make
fi
Предположительно есть команда automake , которая сделает этот хак ненужным.