我的C ++ 03项目需要升级到C ++ 11,我可以保证至少在我想要使用的所有GCC中都可以使用它的实验性支持。
但是,这可能是-std=c++0x
,或者可能是来自较新GCC的实际-std=c++11
。有一天它会-std=c++14
(当CentOS赶上......)。
如何构建一个GNU Makefile,将“最佳”标记添加到CXXFLAGS
,具体取决于哪个会成功?
我可以只是说“好吧,我使用的最早的GCC仍然没有生产就绪的C ++ 11支持所以我应该坚持使用C ++ 03”,但是meh。< / p>
答案 0 :(得分:5)
这将选择$(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)
为了获得额外的乐趣,您可以根据其他变量在c++
和gnu++
模式之间进行选择:
CXX_MODE.42 := 98
CXX_MODE.43 := $(CXX_MODE.42)
CXX_MODE.44 := $(CXX_MODE.43)
CXX_MODE.45 := $(CXX_MODE.44)
CXX_MODE.46 := 0x
# Unnecessary, since -std=c++0x still works, but hey why not:
CXX_MODE.47 := 11
CXX_MODE.48 := $(CXX_MODE.47)
CXX_MODE.49 := $(CXX_MODE.48)
CXX_MODE.5 := 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))
ifneq($(STRICT),)
CXXFLAGS += -std=c++$(CXX_MODE) -pedantic -pedantic-errors
else
CXXFLAGS += -std=gnu++$(CXX_MODE)
endif
答案 1 :(得分:0)
不完全是答案,因为这不提供自动选择,但我认为无论如何它都可能有用。
您可以使用make命令行选项来选择所需内容:
ifeq($(CPP11),Y)
CXXFLAGS+=-std=c++11
endif
ifeq($(CPP14),Y)
CXXFLAGS+=-std=c++14
endif
调用将以这种方式完成:
make <target> CPP11=Y
或
make <target> CPP14=Y