错误:unrecognized command line option “-std=c++11”

出现这个编译错误的原因在g++ gcc 版本不够高。

添加源(Ubuntu)

?
1
2
$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
$ sudo apt-get update

安装4.8版本

1
$ sudo apt-get install gcc- 4.8 g++- 4.8

查看本地安装版本

?
1
2
3
$ ls -lh /usr/bin/g++*
 
这里应该可以看到本机安装了 4.6 4.8 两个版本。

切换版本

?
1
2
3
4
5
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc- 4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++- 4.6
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc- 4.8 40 --slave /usr/bin/g++ g++ /usr/bin/g++- 4.8
sudo update-alternatives --config gcc
 
**选择 4.8 版本的序号**

再次查看g++版本

?
1
2
3
g++ --version
 
确认为 4.8 版本。

参考1:http://www.cocos2d-x.org/forums/6/topics/37467?r=37788#message-37788 
参考2:http://blog.youkuaiyun.com/riverweed/article/details/21329211

<think>好的,我现在遇到了一个问题,就是在使用GCC或Clang编译代码时,遇到了“unrecognized command line option '-std=c++17'”的错误。我需要解决这个问题,但首先得弄清楚为什么会出现这个错误,以及如何正确设置C++17标准。 首先,我应该检查我的编译器版本是否支持C++17。因为不同的编译器版本支持的C++标准可能不同。例如,GCC从哪个版本开始支持-std=c++17呢?记得之前查过资料,可能需要GCC 5或更高版本,但具体版本可能记不太准。同样,Clang的情况可能也不同,可能需要Clang 3.5或更高版本?不过不确定,需要确认。 接下来,如果我的编译器版本太旧,不支持C++17,那么可能的解决方案是升级编译器到支持该标准的版本。或者,是否有其他编译选项可以替代?比如,有些旧版本的编译器可能使用-std=c++1z来启用实验性的C++17支持,但不知道是否适用。 另外,有时候在项目中可能错误地指定了编译器选项的位置,比如在错误的位置添加了-std=c++17,导致编译器无法识别。比如是否在链接阶段错误地添加了这个选项,而不是在编译阶段?这时候需要检查构建系统的配置,比如Makefile或CMakeLists.txt,确保选项放在正确的位置。 还有一种情况是,虽然安装了新版本的编译器,但系统中可能存在多个版本,而实际调用的编译器仍然是旧版本。这时候需要检查PATH环境变量,确认使用的是正确的版本。比如在终端中输入gcc --version或clang --version,看看输出的版本号是否符合支持C++17的要求。 如果确认编译器版本足够新,但仍然报错,可能需要检查是否有拼写错误,比如-std=c++17是否正确,是否有空格或其他字符干扰。或者是否在某些特殊环境下,比如交叉编译时,目标平台不支持该选项? 另外,引用中提到MPFR、MPC和GMP被GCC内部使用,但编译的代码本身不使用这些库。这可能与问题无关,但或许某些依赖库的版本问题会影响编译器的功能,不过可能性较小,暂时先不考虑。 再想到,某些较旧的系统可能自带的GCC版本过低,比如Ubuntu 16.04默认的GCC是5.4,而C++17的支持可能在GCC 7或更高版本才完全支持。这时候可能需要通过添加PPA或自行编译来安装更新的GCC版本。 Clang的情况类似,需要检查版本。例如,Clang 3.5开始支持C++1z,而Clang 5之后可能支持-std=c++17。需要查阅官方文档确认。 总结可能的解决步骤: 1. 检查编译器版本:运行gcc --version或clang --version,确认版本是否支持C++17。 2. 如果版本过旧,升级编译器。 3. 对于旧版本编译器,尝试使用-std=c++1z替代。 4. 检查编译命令中选项的位置是否正确,是否在编译阶段而非链接阶段。 5. 确保系统中调用的编译器是新版本,而非旧版本,可能需要使用绝对路径或调整PATH。 6. 如果使用构建系统,检查配置文件是否正确设置C++17选项。 7. 在代码中确认确实需要C++17特性,避免不必要的标准设置。 例如,如果用户使用的是GCC 4.8,那么根本不支持C++17,必须升级到GCC 7或更高版本。而如果使用的是GCC 5或6,可能部分支持,但需要确认是否支持完整的C++17特性,这时候可能需要升级。 对于Clang,如果版本是3.8,可能还不支持-std=c++17,但可以使用-std=c++1z。而Clang 5及以上应该支持-std=c++17。 另外,某些项目可能错误地将C++17选项传递给其他工具链组件,比如链接器,这时候需要确保只在编译阶段使用该选项。 还有可能用户混淆了gcc和g++,因为gcc默认使用C语言标准,而g++用于C++,但-std选项应适用于两者,不过需要确认。 总之,核心问题在于编译器版本是否支持该选项,以及编译命令是否正确配置。</think>要解决编译器不识别`-std=c++17`命令行选项的问题,可按照以下步骤排查和修复: --- ### **1. 验证编译器版本** **GCC**:C++17标准支持从**GCC 7.1**开始正式生效[^1]。若版本低于此,需升级编译器。 **Clang**:C++17支持从**Clang 5.0**开始,早期版本需使用`-std=c++1z`作为替代选项[^2]。 ```bash # 查看GCC版本 gcc --version # 查看Clang版本 clang --version ``` --- ### **2. 升级编译器(若版本过低)** - **Ubuntu/Debian**: ```bash sudo apt-get install gcc-11 g++-11 # 安装GCC 11 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 100 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 100 ``` - **macOS(Homebrew)**: ```bash brew install gcc@11 ``` --- ### **3. 调整编译选项** - **旧版GCC/Clang**: 若无法升级,尝试使用`-std=c++1z`替代`-std=c++17`(仅部分支持C++17特性): ```bash g++ -std=c++1z main.cpp ``` - **确保选项位置正确**: 编译选项需放在源文件前: ```bash # 正确 g++ -std=c++17 main.cpp -o main # 错误(选项在源文件后可能失效) g++ main.cpp -std=c++17 -o main ``` --- ### **4. 检查构建系统配置** - **CMake**: 在`CMakeLists.txt`中明确指定标准: ```cmake set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) ``` - **Makefile**: 确保`CXXFLAGS`包含`-std=c++17`: ```makefile CXXFLAGS = -std=c++17 -O2 ``` --- ### **5. 验证环境变量** 确认未覆盖编译器路径(如`CC`/`CXX`): ```bash # 临时指定新编译器路径 export CC=/usr/bin/gcc-11 export CXX=/usr/bin/g++-11 ``` --- ### **总结** -错误由**编译器版本过低**引起,升级至GCC ≥7.1或Clang ≥5.0。 - 若需向后兼容,使用`-std=c++1z`。 - 确保编译选项位置正确,且构建系统配置无误。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值