我正在构建一个PHP的c++扩展,使用config模板。从这篇文章和这篇文章的M4。
我需要使用标准的c++ 11来编译我的类,所以我使用了EXTRA_FLAGS子句作为:
EXTRA_FLAGS="-std=c++11"
在我的config.m4。最终代码:
PHP_ARG_ENABLE(vehicles,
[Whether to enable the "vehicles" extension],
[ --enable-vehicles Enable "vehicles" extension support])
if test $PHP_VEHICLES != "no"; then
EXTRA_FLAGS="-std=c++11"
PHP_REQUIRE_CXX()
PHP_SUBST(VEHICLES_SHARED_LIBADD)
PHP_ADD_LIBRARY(stdc++, 1, VEHICLES_SHARED_LIBADD)
PHP_NEW_EXTENSION(vehicles, vehicles.cc car.cc, $ext_shared)
fi
这根本不起作用(编译器不接收额外的标志)。然后我假设这个EXTRA_FLAGS参数与编译器无关,而是与脚本....
有关。我如何发送一个标志到c++编译器,让他们使用c++ 11 ?
我找到了解决办法。以下是最终代码:
PHP_ARG_ENABLE(vehicles,
[Whether to enable the "vehicles" extension],
[ --enable-vehicles Enable "vehicles" extension support])
if test $PHP_VEHICLES != "no"; then
CXX_FLAGS="-std=c++0x"
PHP_REQUIRE_CXX()
PHP_SUBST(VEHICLES_SHARED_LIBADD)
PHP_ADD_LIBRARY(stdc++, 1, VEHICLES_SHARED_LIBADD)
PHP_NEW_EXTENSION(vehicles, vehicles.cc car.cc, $ext_shared)
fi
确保CXX_FLAGS
在PHP_REQUIRE_CXX()
之前,否则它将无法工作。
还有一个名为X_CXX_COMPILE_STDCXX_11([noext], [mandatory])
的宏,它的代码在这里,可以自动执行这个过程。
这个解决方案不适合我。(使用PHP7扩展)我找到了另一个解决方案
if test $PHP_VEHICLES != "no"; then
CXXFLAGS="-std=c++11"
PHP_REQUIRE_CXX()
PHP_SUBST(VEHICLES_SHARED_LIBADD)
PHP_ADD_LIBRARY(stdc++, 1, VEHICLES_SHARED_LIBADD)
PHP_NEW_EXTENSION(vehicles, vehicles.cc car.cc, $ext_shared)
fi
所以基本上唯一的变化是CXX_FLAGS="-std=c++0x"
变成了CXXFLAGS="-std=c++11"
我最近为PHP-7.3编译了我的PHP扩展。配置类似于下面所示的代码片段:
PHP_ARG_ENABLE(vehicles, whether to enable vehicles support,
dnl Make sure that the comment is aligned:
[ --enable-vehicles Enable vehicles support], no)
if test "$PHP_VEHICLES" != "no"; then
CXXFLAGS="-std=c++11" //other C++ linker flags go here
PHP_REQUIRE_CXX()
PHP_SUBST(VEHICLES_SHARED_LIBADD)
PHP_ADD_LIBRARY(stdc++, 1, VEHICLES_SHARED_LIBADD)
PHP_NEW_EXTENSION(Vehicles, vehicles.cc car.cc, $ext_shared)
fi
另外,看看从编译尝试中生成的Makefile
。它很可能包含有关所需的任何额外配置的信息。
注意ext/intl
使用c++,所以它是一个寻找灵感的好地方。对于PHP 7.4, c++宏得到了一些关注;ext/intl
使用一个新的宏PHP_CXX_COMPILE_STDCXX
和现有的PHP_REQUIRE_CXX()
。
PHP_REQUIRE_CXX()
PHP_CXX_COMPILE_STDCXX(11, mandatory, PHP_INTL_STDCXX)
11
代表c++版本,目前它支持11、14和17。然后将PHP_INTL_STDCXX
变量添加到链接标志中。