如何在 Makefile.am 中指定我想要 C++0x?

Posted

技术标签:

【中文标题】如何在 Makefile.am 中指定我想要 C++0x?【英文标题】:How can I specify that I want C++0x in Makefile.am? 【发布时间】:2011-12-21 04:33:43 【问题描述】:

目前我的项目有以下简单的树:

./Makefile.am
./configure.ac
./README
./src/main.cpp
./src/Makefile.am
./bin

我正在尝试遵循以下教程:

http://www.gnu.org/software/automake/manual/automake.html#Hello-World

如何指示 configure.ac 使用 C++0x 扩展?特别是如果 main.cpp 文件中的 hello-world 行如下:

cout << ([] () return "Hello, World!";) () << endl;

发出“make”会导致错误。

【问题讨论】:

您使用的是哪个编译器?如果是 GCC,你需要 4.6 或更高版本的 lambda,那么它应该是修改 makefile 以添加标志以将编译器置于 c++0X 模式的情况,或者 --std=c++0x 或 --std =gnu++0x 取决于你是否想要 c++0x 的 GNU 方言。 How to use C++11 features with Autoconf?的可能重复 @awoodland,我从另一个线程中尝试了您的建议。我收到以下错误:“./configure: line 2962: syntax error near unexpected token `-std=c++0x,'” 之后突出显示的错误行如下:AX_CHECK_COMPILE_FLAG(-std=c++0x, CXXFLAGS="$CXXFLAGS -std=c++0x")。前面的行说“检查 g++ 的依赖样式... gcc3。”我认为这就是问题所在。但我安装了 GCC 4.6.2,它是 GCC 的默认版本。 (运行 gcc -v 返回版本 4.6.2。) @Shredderroy - 编译器版本对于 autoconf 的东西并不重要,但您确实需要使用 [ ] 引用 -std=c++0x,就像我在示例中所做的那样。如果您不熟悉 autotools,您可能对 Autoconf quoting 感兴趣。 以防万一,我使用的是 Fedora 16 和 KDE 4.7.3。 【参考方案1】:

如果您使用 gcc(看起来像),那么从 libstdc++ manual 他们有用于检查 c++ 基础语言功能的 autoconf 示例:

# AC_COMPILE_STDCXX_OX
AC_DEFUN([AC_COMPILE_STDCXX_0X], [
  AC_CACHE_CHECK(if g++ supports C++0x features without additional flags,
  ac_cv_cxx_compile_cxx0x_native,
  [AC_LANG_SAVE
  AC_LANG_CPLUSPLUS
  AC_TRY_COMPILE([
  template <typename T>
    struct check
    
      static_assert(sizeof(int) <= sizeof(T), "not big enough");
    ;

    typedef check<check<bool>> right_angle_brackets;

    int a;
    decltype(a) b;

    typedef check<int> check_type;
    check_type c;
    check_type&& cr = c;],,
  ac_cv_cxx_compile_cxx0x_native=yes, ac_cv_cxx_compile_cxx0x_native=no)
  AC_LANG_RESTORE
  ])

  AC_CACHE_CHECK(if g++ supports C++0x features with -std=c++0x,
  ac_cv_cxx_compile_cxx0x_cxx,
  [AC_LANG_SAVE
  AC_LANG_CPLUSPLUS
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -std=c++0x"
  AC_TRY_COMPILE([
  template <typename T>
    struct check
    
      static_assert(sizeof(int) <= sizeof(T), "not big enough");
    ;

    typedef check<check<bool>> right_angle_brackets;

    int a;
    decltype(a) b;

    typedef check<int> check_type;
    check_type c;
    check_type&& cr = c;],,
  ac_cv_cxx_compile_cxx0x_cxx=yes, ac_cv_cxx_compile_cxx0x_cxx=no)
  CXXFLAGS="$ac_save_CXXFLAGS"
  AC_LANG_RESTORE
  ])

  AC_CACHE_CHECK(if g++ supports C++0x features with -std=gnu++0x,
  ac_cv_cxx_compile_cxx0x_gxx,
  [AC_LANG_SAVE
  AC_LANG_CPLUSPLUS
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -std=gnu++0x"
  AC_TRY_COMPILE([
  template <typename T>
    struct check
    
      static_assert(sizeof(int) <= sizeof(T), "not big enough");
    ;

    typedef check<check<bool>> right_angle_brackets;

    int a;
    decltype(a) b;

    typedef check<int> check_type;
    check_type c;
    check_type&& cr = c;],,
  ac_cv_cxx_compile_cxx0x_gxx=yes, ac_cv_cxx_compile_cxx0x_gxx=no)
  CXXFLAGS="$ac_save_CXXFLAGS"
  AC_LANG_RESTORE
  ])

  if test "$ac_cv_cxx_compile_cxx0x_native" = yes ||
     test "$ac_cv_cxx_compile_cxx0x_cxx" = yes ||
     test "$ac_cv_cxx_compile_cxx0x_gxx" = yes; then
    AC_DEFINE(HAVE_STDCXX_0X,,[Define if g++ supports C++0x features. ])
  fi
])

如果需要,您可以尝试在其中放置一个 lambda。然后,有了 HAVE_STDCXX_0X,您就可以适当地设置 --std=c++0x。

【讨论】:

哇!非常感谢您的扩展回复。我现在会尝试一下,然后报告 除非您是 autoconf 的维护者,否则您不应定义名称以“AC_”开头的宏。 Autoconf 为自己保留该命名空间。

以上是关于如何在 Makefile.am 中指定我想要 C++0x?的主要内容,如果未能解决你的问题,请参考以下文章

在 Makefile.am 的 C++ 库中编译 C 文件

如何在 Makefile.am 中调整 PATH 变量?

我应该如何从 Makefile.am 运行预构建的 Makefile?

如何影响目标的顺序,为 Makefile.am 添加额外的步骤等?

Mono:如何在 Makefile.am 中添加 DLL 引用?

如何在 RSACryptoServiceProvider .NET 类中指定公钥