本人最近开始复习算法刷题了,然后用的是 macOS 上 VSCode 的默认配置,也就是 clang/clang++ 编译器,但是高中的时候用惯了 gcc/g++ 了,很多 g++ 的方言 clang 并不支持,例如 #include <bits/stdc++.h> 之类的

可能你会说,这有什么的,直接把编译指令里面的编译器替换一下不就行了

如果真的这么简单的话就没有这篇博客了(bushi

首先我换了之后并不能解决问题, 接着我发现了一个很恐怖的事情(

41a03f9b1946237c16f16a8b4b805eb8

我的 gcc 怎么被 clang 夺舍了???

我的第一个反应是卸载 clang ,毕竟我也不想用这玩意,然后我看这东西是哪里安装的

1
2
whereis clang
clang: /usr/bin/clang /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/share/man/man1/clang.1

啊,原来是 Xcode 哇,这东西我平时也用不上,还占着这么大的空间,我这就把你卸了

image-20230404213422795

Xcode 是我刚开始上手 macOS 的时候学长建议我安装的,但是这东西快15个G,我平时又用不上

卸完之后我发现 clang 还是在,我就继续看

1
2
whereis clang
clang: /usr/bin/clang /Library/Developer/CommandLineTools/usr/share/man/man1/clang.1

原来是 CommandLineTools ,我又搜了一下这个 CommandLineTools 是个什么东西,原来是 Xcode 开发环境的一部分,但是其实可以不依附 Xcode 单独存在

学长让我安装 Xcode 其实就是为了安装这个东西,其实这个东西通过这个命令就能安装

1
xcode-select --install

好了,现在的目标是解决这个东西,但是我 Google 了一下,却发现这东西我还不能卸了

image-20230404215657969

好家伙,我直呼内行

是的,我的确使用 brew install gcc 安装了 gcc和g++,但是我一直不知道怎么调用

image-20230404215943715

现在我知道了,原来要加上你的版本号才能调用到 gcc 本尊

行吧,我这就去手动指定编译器路径

先看看这东西的路径

1
2
whereis g++-12
g++-12: /opt/homebrew/bin/g++-12 /opt/homebrew/share/man/man1/g++-12.1

然后去改 .vscode 下的 tasks.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"tasks": [
{
"type": "cppbuild",
"label": "build",
"command": "/opt/homebrew/bin/g++-12", // 手动指定 g++-12 的位置
"args": [
"-fdiagnostics-color=always",
"-std=c++17", // 手动指定c++标准
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
}
],
"version": "2.0.0"
}

顺便把 launch.json 也记录一下把,这两个文件一个是定义如何编译的,一个是定义怎么运行的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"version": "0.2.0",
"configurations": [
{
"name": "g++",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "lldb"
}

]
}

PS:顺便说一下这个 externalConsole ,在 Windows/Linux 上我用 C/C++ 扩展运行的时候都能把标准输出打印到集成终端上,但是在 macOS 上死活不可以,后来仔细一看原来打到了调试控制台上,如果我把这东西改为 true 的时候,它又会弹出一个终端出来,很难受

后来一看文档才知道真的没法像 Windows/Linux 一样使用集成终端输入输出

image-20230404221547287

最后一想,算了,我 Windows/Linux 上一般都是用文件输入的

1
2
3
4
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif

记着调试的时候把 output 那行注释调然后去调试控制台看输出吧

改完之后我发现我的包导入不了了(后来知道原来的包都是 Xcode 里面的),我又想看看 g++的 lib 路径,这一般和 g++ 是放在一起的

然后发现是个软连接

image-20230404223427601

然后我翻了一下,是在这个位置

1
/opt/homebrew/Cellar/gcc/12.2.0/lib/

去扩展设置里面手动指定一下 Compiler PathInclude Path

image-20230404223937247

发现可以用了,按住 cmd 点进去头文件,再次确认路径

这时群里说其实可以用 alias ,我一想的确啊,毕竟 alias 的优先级是最高,这下可以给 gcc 正名了

image-20230404225434212

直接进 ~/.zshrc 敲上两行

1
2
alias g++='g++-12'
alias gcc='gcc-12'

image-20230404225940813

然后我使用 Code Runner 快速运行的时候会遇到错误,一想是C++标准的问题,我又去扩展设置手动改调用参数

image-20230404225244331

image-20230404230232087

最后我还想让 Code Runner 支持从集成终端输入输出,我有时也会从终端手动输入数据的

image-20230404230446584

现在终于可以愉快地 Coding 了!按下 Code Runner 的快捷键,自动从 input.txt 读取并输出到 output.txt

image-20230404230536482

image-20230404230824614

当我需要调试的时候, 把重定向 output 的那行注释掉,然后到调试控制台观察输出