无法使 automake 使用 C++11

Can't make automake to use C++11

我正在做一些项目,似乎我无法制作使用 C++11 的 automake 脚本。

在我的项目的 rootdir 中,我有文件 Makefile.am,它看起来像这样(它是由 eclipse 自动生成的):

SUBDIRS=src

然后在 /rootdir/src 我有 Makefile.am 看起来像这样:

AM_CXXFLAGS=-Wall -fPIC -std=gnu++11 -DVERSION=\"$(VERSION)\" -DPROG="\"$(PACKAGE)\""

bin_PROGRAMS = algatorc
algatorc_SOURCES = algatorc.cpp
include_HEADERS = Timer.hpp TestSetIterator.hpp TestCase.hpp ETestSet.hpp EParameter.hpp Entity.hpp ParameterSet.hpp AbsAlgorithm.hpp Log.hpp JSON.hpp JSONValue.hpp

lib_LIBRARIES = libAlgatorc.a
libAlgatorc_a_SOURCES = ParameterSet.cpp TestCase.cpp EParameter.cpp ETestSet.cpp TestSetIterator.cpp Entity.cpp Timer.cpp JSON.cpp JSONValue.cpp AbsAlgorithm.cpp
algatorc_LDADD=libAlgatorc.a

因此,我为 C++11 支持添加了 -std=gnu++11,但我仍然收到此错误:

g++ -DPACKAGE_NAME=\"algatorc\" -DPACKAGE_TARNAME=\"algatorc\" -DPACKAGE_VERSION=\"1.0\" -DPACKAGE_STRING=\"algatorc\ 1.0\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"algatorc\" -DVERSION=\"1.0\" -I.     -g -O2 -MT algatorc.o -MD -MP -MF .deps/algatorc.Tpo -c -o algatorc.o algatorc.cpp
In file included from /usr/include/c++/4.8/thread:35:0,
                 from Log.hpp:281,
                 from algatorc.cpp:18:
/usr/include/c++/4.8/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
 #error This file requires compiler and library support for the \
  ^

从这个错误中我可以看出 g++ 没有使用 -Wall -fPIC -std=gnu++11 但我不明白为什么。它使用的是完全不同的东西。 这是我的 configure.ac 脚本,位于我项目的 rootdir

AC_PREREQ([2.69])
AC_INIT([algatorc], [0.1], [my_mail])
AC_CONFIG_SRCDIR([src/TestCase.hpp])
#AC_CONFIG_HEADERS([config.h])

LT_INIT
AM_INIT_AUTOMAKE

# Checks for programs.

AC_PROG_CXX

# Checks for libraries.

# Checks for header files.
AC_CHECK_HEADERS([stdlib.h string.h sys/time.h unistd.h wchar.h wctype.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_CHECK_HEADER_STDBOOL
AC_C_INLINE
AC_TYPE_SIZE_T

# Checks for library functions.
AC_FUNC_MALLOC
AC_FUNC_MKTIME
AC_CHECK_FUNCS([gettimeofday memset mkdir])

LIBS=-ldl

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

我也尝试过将 AX_CXX_COMPILE_STDCXX_11 添加到 configure.ac 脚本,但仍然出现错误。知道如何解决这个问题吗?

我正在使用 Ubuntu 12.04 x64 和 Eclipse(版本:Mars Release (4.5.0))

快速测试表明一切正常,配置相似,因此您只需卷起袖子查看您的最终 Makefile.

查看 automake-d 的内部 Makefile。您应该在其中的某处找到 .cpp.o 的最终构建规则。搜索“.cpp.o”。它应该看起来像这样:

.cpp.o:
    $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
    $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po

验证完这一点后,下一步就是查看您的 CXXCOMPILE 宏定义的内容。它应该看起来像这样:

CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
    $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)

这就是您正在使用的 AM_CXXFLAGS 变量。最后,确认它在实际Makefile.

中是如何定义的

就我而言,对于我的简单测试,它只是:

AM_CXXFLAGS = -std=gnu++11

在我的例子中,只是在你的例子中,显然你会有其他标志。

就是这样。 automake-d Makefile 显然很大,看起来很吓人,但是当你深入了解它时,它一点也不复杂。

这将是两件事之一。 Makefile.am 的另一部分破坏了 AM_CXXFLAGS 的值,或者 CXXCOMPILE 宏被破坏了。关于 automake 的一件事是,如果重新定义宏或变量,它通常不会抱怨。它只会使用变量的最终值生成最终的 Makefile 。所以,我想稍后在您的 Makefile.am 中的某个地方,您将 AM_CXXFLAGS 设置为其他内容,而在这里没有意识到它。

注意:实际的宏经常会随着 automake 的每个后续版本进行调整,因此您的宏看起来可能略有不同,但总体思路应该是相同的。 .cpp.o 构建规则运行 CXXCOMPILE 宏,它使用 AM_CXXFLAGS.

首先,automake不会生成Makefile,直到执行automake

So, I added -std=gnu++11 for C++11 support but I still get this error:

g++ -DPACKAGE_NAME=\"algatorc\" -DPACKAGE_TARNAME=\"algatorc\" -DPACKAGE_VERSION=\"1.0\" -DPACKAGE_STRING=\"algatorc\ 1.0\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"algatorc\" -DVERSION=\"1.0\" -I.     -g -O2 -MT algatorc.o -MD -MP -MF .deps/algatorc.Tpo -c -o algatorc.o algatorc.cpp
In file included from /usr/include/c++/4.8/thread:35:0,
             from Log.hpp:281,
             from algatorc.cpp:18:
/usr/include/c++/4.8/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
#error This file requires compiler and library support for the \
^
  • 你的日志说 gcc 的编译时没有 -std=gnu++11 的语句。换句话说,automake 没有生成 Makefile 包含 -std=gnu++11.
  • 的语句

因此,您需要做的就是在项目根目录中使用命令行:

$ autoreconf

这将自动执行 aclocalautoconfautomake 和 blah blah...

  • 关于检查 -std=c++11 标志

很好用ax_cxx_compile_stdcxx_11.m4
要使用它,需要从上面的link下载,然后在$(project_top)/m4/
中设置 接下来,你在configure.ac中这样写:

AX_CXX_COMPILE_STDCXX_11([noext], [mandatory])

还有 exec,你可以检查是否可以在平台中使用 C++11 特性

$ autoreconf -vi -I m4
$ ./configure