2011-11-02 78 views
11

我有一个通过Autoconf配置的项目,我想在这个项目中开始使用C++ 11的功能。如何使“-std = gnu ++ 0x”开关始终处于启用状态并支持配置时检查的功能?如何在Autoconf中使用C++ 11功能?

+2

除非你想使用GCC扩展大的宏库,你要使用的开关是“-std =的C++ 0x”。 –

+0

这已经用Autoconf宏在这里解决了http://stackoverflow.com/questions/8585110/how-can-i-specify-that-i-want-c0x-in-makefile-am。它的优点是,如果你没有C++ 11编译器支持,它不会失败,而AC_CHECK_COMPILE_FLAG会在失败时停止构建。 – 2013-01-03 09:00:49

+0

如果之前已经询问过,这怎么可能是重复的? – lvella

回答

13

你可以像AX_CHECK_COMPILE_FLAG做到这一点,如:

AX_CHECK_COMPILE_FLAG([-std=c++0x], [ 
         CXXFLAGS="$CXXFLAGS -std=c++0x"]) 

(你必须要小心这里AC_LANG是C++,在点不是C这就是所谓的,因为它是可以使用GCC对C和其他的C++或反之亦然)。

+1

这可能是不够的:如果编译器不支持-std == C++ 0x,那么配置会成功,但构建将失败。 –

+0

+1,因为很容易添加AC_MSG_ERROR的第三个参数 –

+0

@WilliamPursell - 更有用的事情可能是使用AC_DEFINE与此结合使用,以便构建仍然可以继续进行,只需使用不同的部分实现与我今天在C中处理'snprintf'丢失的方式完全一样。这可能不是通过替代界面暴露或暴露的功能,但它可能不是现在的显示屏。 – Flexo

1

为了让编译器开关(除非,当然,用户覆盖它),把这个在您的Makefile.am

AM_CXXFLAGS=-std=c++0x 

我不认为有一个为C的存在可用支票++ 11功能,但您应该能够使用要使用的功能轻松编写测试程序,如果这些功能不受支持,则该功能将失败。然后在this section of the Autoconf manual.

+1

如果在没有C++ 11功能的情况下测试失败,则标志将需要位于CXXFLAGS中,否则配置将始终失败。 –

4

描述,你可以写一个测试,我认为这样做最简单的方法是添加:

 
CXXFLAGS="$CXXFLAGS -std=c++0x" 

在AC_PROG_CXX前configure.ac。如果编译器不接受-std = C++ 0x,则配置将失败,并且“C++编译器无法创建可执行文件”。它不是最好的错误消息,但它确保如果配置成功,构建将成功。要获得更好的错误消息,可以检查编译器是否接受AC_PROG_CXX之后的标志。无论哪种情况,如果编译器不提供必要的功能,但软件需要它,则希望配置失败。

请注意,在用户在运行configure时未设置该变量的情况下,在AC_PROG_CXX之前设置CXXFLAGS会产生妨碍CXXFLAGS默认设置的不良副作用。出于这个原因,通常不建议在configury中设置CXXFLAGS,所以最好在AC_PROG_CXX之后检查标志(例如使用awoodland的解决方案) - 只要确保在AX_CHECK_COMPILE_FLAG的第三个参数中添加了AC_MSG_ERROR,以便如果功能不可用,配置将失败。

17

你查过ax_cxx_compile_stdcxx_11

我认为这正是你想要的。

上有gnu website.

+4

这很可能是正确的解决方案。人们只需记住在Debian中安装压缩包'autoconf-archive',然后在运行'autoconf'(将所需的宏拉入'aclocal.m4')之前运行'aclocal'。 – carandraug

+0

这是比我的更好的解决方案,当我最初回答这个问题时并不存在。 – Flexo

+0

@carandraug如果您或OP能够阐明更多细节,我将不胜感激。什么是正确的安装和使用语法?在安装autoconf-archive之前,我总是会在configure.ac中调用一个语法错误(不是“找不到”)错误。安装autoconf-archive后,我得到“语法错误:接近意外的标记'ac_config_headers =”$ ac_config_headers config.h“' – garyp