为何Xcode可用C++17编译标志,终端clang++使用却报错?
解决终端clang++不支持
-std=c++17的问题 嘿,我之前也碰到过一模一样的情况!核心原因其实是终端默认调用的clang,和Xcode内置的clang并非完全同一套工具链——虽然版本号都是Apple LLVM 9.0.0,但Xcode里的clang提前支持了c++17这个正式标识,而系统默认的clang还只认C++17的预览版标识c++1z。
下面给你几个可行的解决办法:
办法一:让终端使用Xcode的clang工具链
这是最彻底的方案,之后终端里的clang就和Xcode里的完全一致了:
- 先确认你的Xcode安装路径,运行命令:
正常输出应该是xcode-select -p/Applications/Xcode.app/Contents/Developer - 把Xcode的工具链路径加到环境变量
PATH的最前面,临时生效可以直接在终端执行:export PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH" - 如果想永久生效,就把上面这句话添加到你的shell配置文件里:
- 用bash的话,编辑
~/.bash_profile - 用zsh的话,编辑
~/.zshrc
- 用bash的话,编辑
- 之后重启终端,运行
clang++ --version确认版本和Xcode里的一致,再用-std=c++17编译就没问题了。
办法二:直接指定Xcode的clang路径编译
如果不想改环境变量,每次编译时直接用Xcode clang的完整路径就行:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -std=c++17 test.cpp -o test
办法三:使用预览版标识兼容系统clang
要是你暂时不想动工具链,也可以把编译选项换成C++17正式命名前的预览标识,系统默认的clang 9.0.0是支持的:
- 替代
-std=c++17:用-std=c++1z - 替代
-std=gnu++17:用-std=gnu++1z
大部分C++17的特性用这个标识也能正常编译通过。
内容的提问来源于stack exchange,提问作者Rpessoa
相关产品推荐
相关产品推荐

