使用g++4.3.3编译Makefile.unix时遇-std=c++03/0x报错求助
-std=c++03不被识别的问题 首先得明确:g++ 4.3.3根本不支持-std=c++03这个命令行选项。因为在这个版本里,C++03就是默认的编译标准,所以这个参数完全是多余的——这也是你看到cc1plus: error: unrecognized command line option "-std=c++03"的核心原因。
至于你尝试make -f makefile.unix CXXFLAGS="-std=c++0x"还是报错,大概率是因为makefile.unix里硬编码了-std=c++03参数,而且你的CXXFLAGS传入没有覆盖掉原文件里的设置(比如makefile里用了CXXFLAGS := ...而不是CXXFLAGS ?= ...,这种情况下用户传入的变量会被忽略)。
给你几个可行的解决办法,按优先级排序:
方法1:直接修改Makefile(最稳妥)
打开makefile.unix,找到定义CXXFLAGS的行,把里面的-std=c++03删掉就行。因为g4.3.3默认就是按C03标准编译的,完全不需要这个参数。
如果想让Makefile对不同g++版本兼容,可以加一段版本判断逻辑:
# 获取g++主版本和次版本 GCC_VERSION := $(shell g++ -dumpversion | cut -d'.' -f1,2) # 针对g++4.3版本移除无效的-std=c++03参数 ifeq ($(GCC_VERSION), 4.3) CXXFLAGS := $(filter-out -std=c++03,$(CXXFLAGS)) else # 其他版本保留-std=c++03(如果需要的话) CXXFLAGS += -std=c++03 endif
方法2:强制覆盖Makefile里的CXXFLAGS(无需修改文件)
如果你不想改动Makefile,可以用make的变量覆盖机制,加上override关键字强制替换:
make -f makefile.unix override CXXFLAGS="这里放你需要的参数,比如空或者-std=c++0x"
比如如果软件只需要C++03,直接用:
make -f makefile.unix override CXXFLAGS=""
这样就能完全替换掉Makefile里带-std=c++03的CXXFLAGS设置。
补充说明
如果你的软件确实需要用到C11的部分特性,g4.3.3是支持-std=c++0x的(这是当时C11标准还未正式发布时的临时选项),但要注意这个版本对C11的支持非常有限,很多特性都没有实现。
内容的提问来源于stack exchange,提问作者Igor

