从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_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
变量添加到链接标志中。
相关文章:
- 编译器如何区分std::vector的构造函数
- C++ std::function 对于类 exept 的所有实例都是空的(只有 Visual2019 编译器问题)
- 编译器不会使用 -std=c++11 编译智能指针
- 在模板化成员函数的返回类型中使用 std::enable_if 时的编译器差异
- 'std::filesystem::d irectory_iterator' 编译器问题
- Arduino编译器和STL:使用std::vector和std::map
- 为什么 std::count 比 MSVC 编译器的普通循环慢,但与 GCC 相等?
- 来自 std::chrono 的编译器警告,但未被使用
- 警告级别为 3 的 int 的 std::vector push_back 处的编译器警告
- 编译器是否对 std::frexp 进行了内联调用?
- msvc 编译器(和其他编译器)如何知道要绑定到哪个 std 重载?
- 为什么编译器抱怨 std::thread 参数在转换为右值后必须是可调用的?
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- 为什么使用 <uint8_t>MSVC 2015 编译器的 std::vector::insert 比 std::copy 快 5 倍?
- std矢量内存分配linux与windows编译器
- 从 std::ostream 重载 << 运算符时,为什么编译器会给出"too many parameters for this operator function"错误?
- 对从引用到 std::reference_wrapper 或编译器错误的隐式转换的理解不正确?
- 编译器是否足够聪明,以至于 std::move 变量超出范围?
- std::fstream 已使用,但编译器抛出错误
- 为什么编译器不能优化这个 std::string 构造?