无法使 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
这将自动执行 aclocal
、autoconf
、automake
和 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
我正在做一些项目,似乎我无法制作使用 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
这将自动执行 aclocal
、autoconf
、automake
和 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