从PHP调用C/ c++库函数-如何向编译器发送-std= C+ 11


Calling C/C++ library function from PHP - How to send a -std=c+11 to compiler

我正在构建一个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_FLAGSPHP_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变量添加到链接标志中。