C++ 我可以让我的Makefile自动使GCC使用它支持的最新标准吗?

C++ 我可以让我的Makefile自动使GCC使用它支持的最新标准吗?,c++,c++11,gcc,c++14,gnu-make,C++,C++11,Gcc,C++14,Gnu Make,我的C++03项目需要升级到C++11,我可以保证,在我想要使用的所有GCC中,至少会有对它的实验支持 但是,这可能是较新的GCC中的-std=c++0x,也可能是实际的-std=c++11。总有一天会是-std=c++14(当CentOS赶上时…) 如何形成一个GNU Makefile,将“最佳”标志添加到cxflags中,具体取决于哪个会成功? 我可以说“好的,我最早使用的GCC仍然没有生产就绪的C++11支持,所以我应该坚持使用C++03”,但是meh。这将选择$(CXX)编译器支持的最佳

我的C++03项目需要升级到C++11,我可以保证,在我想要使用的所有GCC中,至少会有对它的实验支持

但是,这可能是较新的GCC中的
-std=c++0x
,也可能是实际的
-std=c++11
。总有一天会是
-std=c++14
(当CentOS赶上时…)

如何形成一个GNU Makefile,将“最佳”标志添加到
cxflags
中,具体取决于哪个会成功?


我可以说“好的,我最早使用的GCC仍然没有生产就绪的C++11支持,所以我应该坚持使用C++03”,但是meh。

这将选择
$(CXX)
编译器支持的最佳选项:

CXX_MODE.42 := -std=c++98
CXX_MODE.43 := $(CXX_MODE.42)
CXX_MODE.44 := $(CXX_MODE.43)
CXX_MODE.45 := $(CXX_MODE.44)
CXX_MODE.46 := -std=c++0x
# Unnecessary, since -std=c++0x still works, but hey why not:
CXX_MODE.47 := -std=c++11
CXX_MODE.48 := $(CXX_MODE.47)
CXX_MODE.49 := $(CXX_MODE.48)
CXX_MODE.5 := -std=c++14
CXX_MODE.6 := $(CXX_MODE.5)
GXX_VERSION := $(shell $(CXX) -dumpversion | awk -F. '$$1<5{print $$1$$2} $$1>=5{print $$1}')
CXX_MODE := $(CXX_MODE.$(GXX_VERSION))
CXXFLAGS += $(CXX_MODE)

这不完全是一个答案,因为这并没有提供一个自动选择,但我认为它可能是有用的

您可以使用“生成”命令行选项选择所需内容:

ifeq($(CPP11),Y)
    CXXFLAGS+=-std=c++11
endif

ifeq($(CPP14),Y)
    CXXFLAGS+=-std=c++14
endif
呼叫方式如下:

make <target> CPP11=Y
make CPP11=Y

make CPP14=Y

-std=c++0x
在较新版本中可用,作为
-std=c++11
的同义词,因此您可以利用这种尊重将c++03迁移放到您的devstream中。@Bathsheba:我们花了足够长的时间!当管理层认为这只是一个轻触开关的例子时,他们很容易接受lol@JonathanWakely: ..... 哦尽管如此,我还是希望在访问C++14编译器时能够继续这种趋势,所以。。。我想让我的Makefile根据最新的支持语言标准编译,然后(我猜)使用宏使代码本身“可移植”。我稍微修改了措辞。我想知道你从中得到了什么。您的代码需要
-std=c++14
,或者不需要。在第一种情况下,旧的GCC版本已经过时;在后一种情况下,您可以使用
-std=c++11
。也就是说,GCC现在确实需要一个
-std=c++
,并将其作为默认值。这个“点”语法是否有文档记录?有链接吗?我记得gcc定义了一个宏,指示它实现了哪个Cxx修订级别。一个更邪恶的实现将运行gcc,转储该宏,并使用它来选择正确的选项。@SamVarshavchik,如果你是指
\uuuu cplusplus
,这是标准所要求的,但在gcc 4.7之前没有准确设置,所以你会得到错误的答案。@kebs它们只是制造变量。点是变量名称中的有效字符。如果愿意,可以使用下划线。我所做的一切就是连接
CXX\u模式。
$(GXX\u版本)
,然后引用该名称的变量
$(CXX\u模式。$(GXX\u版本))
,这是上面定义的变量之一。点并没有做任何特殊的事情,只是在名称的固定部分和扩展另一个变量的部分之间的分隔符,使其在视觉上清晰可见。
make <target> CPP11=Y
make <target> CPP14=Y