As 莱姆斯 说 https://stackoverflow.com/questions/1110682/extending-php-with-c/1110760#1110760,您可以使用 Zend API 通过 C/C++ 扩展 PHP。链接教程由萨拉·戈尔蒙 http://devzone.zend.com/article/1021是一个好的开始,这本书扩展和嵌入 PHP https://rads.stackoverflow.com/amzn/click/com/067232704X同一作者更详细地介绍了该主题。
然而,值得注意的是,这两者(以及我在网上找到的几乎所有其他内容)都集中在 C 上,并没有真正涵盖让 C++ 扩展工作所需的一些调整。
In the config.m4
您需要显式链接到 C++ 标准库的文件:
PHP_REQUIRE_CXX()
PHP_ADD_LIBRARY(stdc++, 1, PHP5CPP_SHARED_LIBADD)
任何 C++ 库编译检查config.m4
文件还需要链接 C++ 库:
PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,,
[
AC_MSG_ERROR([lib $LIBNAME not found.])
],[
-lstdc++ -ldl
])
编辑 - 以下是指定 g++ 的方法:
最后,为了在构建扩展时选择 C++ 而不是 C 编译器/链接器,6th参数为PHP_NEW_EXTENSION()
应该"yes"
. ie:
PHP_NEW_EXTENSION(your_extension,
your_extension.cpp,
$ext_shared,
,
"-Wall -Werror -Wno-error=write-strings -Wno-sign-compare",
"yes")
来自PHP构建系统手册 http://www.tufat.com/docs/php_manual/internals2.buildsys.configunix.html#internals2.buildsys.configunix.finishing,参数为:
- 扩展名
- 属于扩展的所有源文件的列表。
- (选修的)
$ext_shared
,当调用 PHP_ARG_WITH() 时由配置确定的值
- (可选)“SAPI 类”,仅对于专门需要 CGI 或 CLI SAPI 的扩展有用。在所有其他情况下,它应该留空。
- (可选)构建扩展时要添加到 CFLAGS 的标志列表。
- (可选)一个布尔值,如果“是”,将强制使用 $CXX 而不是 $CC 构建整个扩展。
我无法弄清楚如何让配置脚本将 g++ 设置为编译器/链接器而不是 gcc,因此最终使用 sed 命令破解 Makefile,在我的 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 http://www.gnu.org/software/automake/命令将使这个黑客变得不必要。