平时在 Linux 或 OJ 上写 C++,常见写法是:
1 |
|
但在 macOS 下,默认是 Apple Clang + libc++,不是 Linux 常见的 GCC +
libstdc++,所以 bits/stdc++.h 往往不能直接正常工作。
一、目标
要解决的是两件事:
- 终端里
g++ 1.cpp能正常编译#include <bits/stdc++.h> - Vim 里的 LSP 正常
二、安装 GCC
先安装 Homebrew GCC:
1 | brew install gcc |
安装后通常会有:
1 | /opt/homebrew/bin/g++-15 |
三、使用 g++ 而不是 clang++
macOS 默认 g++ 指向
/usr/bin/g++,而它本质上是 Apple Clang。
在~/.zshrc 里添加:
1 | export PATH="$HOME/.local/bin:$PATH" |
然后执行:
1 | source ~/.zshrc |
期望输出是 /opt/homebrew/bin/g++-15。
四、Vim 设置 g++ 编译
.vimrc
1 | if has('macunix') |
五、clangd 配置
LSP 常用的是 clangd,它不是 GCC,所以要单独处理。
先写一个包装脚本~/.local/bin/clangd-gcc:
1 |
|
再写 macOS 下实际生效的 clangd 用户配置:
文件 ~/Library/Preferences/clangd/config.yaml
1 | CompileFlags: |
然后在 Vim 里把 LSP 指到这个 wrapper:
1 | if has('macunix') |
六、可能的报错
1. 找不到头文件
1 | fatal error: 'bits/stdc++.h' file not found |
这说明你还在用系统默认的 Apple Clang / libc++ 环境,没有切到 Homebrew GCC 这套头文件。
解决方法:
- 安装 Homebrew GCC:
brew install gcc - 在
~/.zshrc里把g++、gcc切到/opt/homebrew/bin/g++-15和/opt/homebrew/bin/gcc-15 - 执行
source ~/.zshrc - 用
which g++确认当前拿到的是 Homebrew GCC,而不是/usr/bin/g++
2. 明明 include 了 bits,却没有 include iostream 等
1 | 1.cpp:8:3: error: use of undeclared identifier 'cin' |
这次真正的问题不是单纯没 include iostream,而是
bits/stdc++.h 里有条件编译。前面有一行:
1 |
<iostream>、<istream>、<ostream>
这些头都在这个条件后面。
如果你只是把 GCC 里的 bits/stdc++.h 接到 macOS 默认的
Apple Clang / libc++ 环境里,这个宏环境就不是 GCC
预期的那套,结果就是后面那批头没有按预期生效。于是表面上看是:
bits/stdc++.h找到了- 但
cin、cout还是未定义
解决方法:
- 终端编译统一使用 Homebrew GCC
clangd通过~/.local/bin/clangd-gcc启动,并带上--query-driver=/opt/homebrew/bin/g++-15,/opt/homebrew/bin/gcc-15clangd统一加上 GCC 的头文件路径,也就是-nostdinc++和三条/opt/homebrew/include/c++/15...的-isystem- Vim 里的 LSP 指到
~/.local/bin/clangd-gcc
七、最后验证
1 |
|
终端里执行:
1 | g++ 1.cpp -o 1 |
如果能正常编译,说明编译器这边通了。
再检查 clangd:
1 | ~/.local/bin/clangd-gcc --enable-config --check=1.cpp --log=info |
正常的话应看到:
1 | All checks completed, 0 errors |