C++ / g++ / VS Code 终端常用指令速查
环境:Windows + VS Code + PowerShell + MinGW g++
一、最常用的编译指令
假设当前目录:
project/
├── main.cpp
├── log.cpp
├── log.h
└── main.exe
1. 编译一个 C++ 文件
g++ main.cpp
默认生成:
a.exe
运行:
.\a.exe
2. 指定生成文件名
g++ main.cpp -o main.exe
然后运行:
.\main.exe
其中:
-o = output
注意:
-o 小写字母 o:指定输出文件
-O2 大写字母 O:优化等级
3. 编译多个 .cpp
g++ main.cpp log.cpp -o main.exe
如果当前目录所有 .cpp 都属于同一个项目:
g++ *.cpp -o main.exe
二、C++ 编译的完整过程
一个 C++ 程序大致经历:
main.cpp
│
│ 预处理
↓
main.i
│
│ 编译
↓
main.s
│
│ 汇编
↓
main.o
│
│ 链接
↓
main.exe
对应 GCC/G++ 的几个重要参数:
-E → 只进行预处理
-S → 生成汇编代码
-c → 生成目标文件
-o → 指定输出文件
三、预处理 -E
1. 直接查看预处理结果
g++ -E main.cpp
2. 保存预处理结果
g++ -E main.cpp -o main.i
生成:
main.i
3. 去掉行号等预处理信息
g++ -E -P main.cpp -o main.i
-P 可以去掉大量类似:
# 1 "main.cpp"
# 1 "iostream"
的信息。
适合观察:
#include
#define
#ifdef
#ifndef
等预处理指令的实际效果。
四、生成汇编代码 -S
最基本:
g++ -S main.cpp
生成:
main.s
使用 Intel 汇编语法
推荐:
g++ -S -masm=intel main.cpp -o main.s
查看优化后的汇编
g++ -O2 -S -masm=intel main.cpp -o main.s
可以生成不同优化版本:
g++ -O0 -S -masm=intel main.cpp -o main_O0.s
g++ -O2 -S -masm=intel main.cpp -o main_O2.s
g++ -O3 -S -masm=intel main.cpp -o main_O3.s
然后在 VS Code 中左右分屏比较:
main_O0.s | main_O2.s
可以很直观地观察编译器优化。
五、只生成目标文件 -c
g++ -c main.cpp
生成:
main.o
例如多文件项目:
g++ -c main.cpp
g++ -c log.cpp
得到:
main.o
log.o
再进行链接:
g++ main.o log.o -o main.exe
整个过程:
main.cpp → main.o ──┐
├──→ main.exe
log.cpp → log.o ───┘
六、优化参数
-O0
关闭优化:
g++ -O0 main.cpp -o main.exe
适合:
- 学习
- 调试
- 观察未经优化的汇编
-O1
基础优化:
g++ -O1 main.cpp -o main.exe
-O2
常用优化:
g++ -O2 main.cpp -o main.exe
通常是比较常用的优化等级。
-O3
更激进的优化:
g++ -O3 main.cpp -o main.exe
可能涉及:
- 函数内联
- 循环优化
- 向量化
- 常量传播
- 死代码删除等
-Os
主要优化程序体积:
g++ -Os main.cpp -o main.exe
嵌入式开发中比较常见。
注意 O 和 0
正确:
-O0
-O1
-O2
-O3
这里是:
大写字母 O
不是数字 0。
错误:
g++ -02 main.cpp
正确:
g++ -O2 main.cpp
七、调试信息 -g
加入调试信息:
g++ -g main.cpp -o main.exe
VS Code + GDB 调试时经常使用。
推荐调试组合:
g++ -g -O0 main.cpp -o main.exe
优化版本:
g++ -O2 main.cpp -o main.exe
八、指定 C++ 标准
例如:
g++ -std=c++17 main.cpp -o main.exe
常见:
-std=c++11
-std=c++14
-std=c++17
-std=c++20
-std=c++23
例如使用 C++20:
g++ -std=c++20 main.cpp -o main.exe
九、开启编译警告
推荐:
g++ -Wall -Wextra main.cpp -o main.exe
更加严格:
g++ -Wall -Wextra -Wpedantic main.cpp -o main.exe
含义:
-Wall 开启大量常见警告
-Wextra 开启额外警告
-Wpedantic 更严格检查标准兼容性
平时可以:
g++ -std=c++17 -Wall -Wextra -g main.cpp -o main.exe
十、推荐的编译参数组合
学习 / 调试
g++ -std=c++17 -Wall -Wextra -g -O0 main.cpp -o main.exe
正常优化
g++ -std=c++17 -Wall -Wextra -O2 main.cpp -o main.exe
多文件项目
g++ -std=c++17 -Wall -Wextra -O2 main.cpp log.cpp -o main.exe
或者:
g++ -std=c++17 -Wall -Wextra -O2 *.cpp -o main.exe
查看优化后的汇编
g++ -O2 -S -masm=intel main.cpp -o main.s
十一、头文件搜索路径 -I
假设:
project/
├── main.cpp
└── include/
└── log.h
代码:
#include "log.h"
可以:
g++ main.cpp -Iinclude -o main.exe
或者:
g++ main.cpp -I.\include -o main.exe
多个目录:
g++ main.cpp -Iinclude -Ithird_party -o main.exe
十二、命令行定义宏 -D
假设:
#ifdef DEBUG
cout << "debug mode";
#endif
编译:
g++ -DDEBUG main.cpp -o main.exe
相当于代码中:
#define DEBUG
也可以:
g++ -DVERSION=3 main.cpp -o main.exe
相当于:
#define VERSION 3
十三、查看 G++ 信息
查看版本
g++ --version
查看 g++ 所在位置
where.exe g++
例如:
E:\mingw64\bin\g++.exe
查看 GCC 版本
gcc --version
十四、反汇编 .exe
首先编译:
g++ -O2 main.cpp -o main.exe
然后:
objdump -d main.exe
使用 Intel 语法:
objdump -d -M intel main.exe
保存:
objdump -d -M intel main.exe > disasm.txt
然后在 VS Code 中打开:
disasm.txt
源代码 + 汇编
编译时加入调试信息:
g++ -g main.cpp -o main.exe
然后:
objdump -d -S -M intel main.exe
这里的 objdump -S 和:
g++ -S
不是同一个意思。
十五、查看符号表
nm main.exe
C++ 推荐:
nm -C main.exe
-C 可以对 C++ 的名称进行 demangle。
例如将类似:
_Z3addii
显示为:
add(int, int)
十六、查看程序大小
size main.exe
通常会看到:
text
data
bss
大致可以理解为:
text → 程序代码
data → 已初始化的全局/静态变量
bss → 未初始化或零初始化的全局/静态变量
十七、PowerShell 目录操作
VS Code 终端例如:
PS E:\c++学习>
说明当前使用 PowerShell。
查看当前位置
pwd
查看当前目录文件
dir
也可以:
ls
进入目录
cd test
绝对路径:
cd "E:\c++学习"
路径存在空格时建议使用引号:
cd "E:\C++ Project\test"
返回上一级
cd ..
返回两级:
cd ..\..
其中:
. → 当前目录
.. → 上一级目录
十八、运行当前目录程序
PowerShell:
.\main.exe
其中:
.\ = 当前目录
所以:
.\main.exe
表示:
运行当前目录中的
main.exe
十九、创建目录
mkdir test
然后:
cd test
完整 PowerShell 写法:
New-Item test -ItemType Directory
二十、创建文件
New-Item main.cpp -ItemType File
简写:
ni main.cpp -ItemType File
二十一、删除文件
rm main.exe
完整:
Remove-Item main.exe
删除所有 .exe:
rm *.exe
二十二、删除文件夹
rmdir test
删除包含内容的目录:
Remove-Item test -Recurse
强制:
Remove-Item test -Recurse -Force
-Recurse -Force使用时需要特别注意路径,避免误删。
二十三、复制文件
cp main.cpp backup.cpp
完整:
Copy-Item main.cpp backup.cpp
复制目录:
Copy-Item src backup -Recurse
二十四、移动 / 重命名
移动:
mv main.cpp src\
重命名:
mv main.cpp test.cpp
也可以:
Rename-Item main.cpp test.cpp
二十五、查看文件内容
cat main.cpp
完整:
Get-Content main.cpp
二十六、清空终端
cls
或者:
Clear-Host
VS Code 中通常也可以:
Ctrl + L
二十七、终止正在运行的程序
Ctrl + C
例如程序进入:
while (true)
{
}
可以使用:
Ctrl + C
强制停止当前终端程序。
二十八、终端历史记录
↑ → 上一条命令
↓ → 下一条命令
例如执行:
g++ -O0 -S -masm=intel main.cpp -o main_O0.s
然后按:
↑
修改为:
g++ -O2 -S -masm=intel main.cpp -o main_O2.s
不需要重新输入整条命令。
二十九、Tab 自动补全
例如存在:
very_long_filename.cpp
输入:
g++ ve
按:
Tab
可以自动补全文件名或路径。
三十、输出重定向 >
g++ -E main.cpp > main.i
含义:
程序输出
↓
文件
例如:
echo hello > test.txt
得到:
hello
注意:
> 会覆盖原文件
三十一、追加输出 >>
echo hello >> test.txt
不会覆盖,而是在文件末尾继续添加。
例如:
echo AAA > test.txt
echo BBB >> test.txt
得到:
AAA
BBB
三十二、管道 |
管道:
左边程序输出
↓
右边程序输入
例如:
Get-Content main.cpp | Select-String "cout"
表示从 main.cpp 中搜索:
cout
三十三、搜索文本
Select-String "main" main.cpp
搜索所有 .cpp:
Select-String "log" *.cpp
三十四、程序输入输出重定向
假设:
input.txt
包含测试数据。
PowerShell 中可以:
Get-Content input.txt | .\main.exe
输出保存:
Get-Content input.txt | .\main.exe > output.txt
即:
input.txt
↓
main.exe
↓
output.txt
非常适合算法题本地测试。
三十五、错误输出
普通输出:
.\main.exe > output.txt
错误输出:
.\main.exe 2> error.txt
全部输出:
.\main.exe *> all.txt
三十六、连续执行命令
在支持 && 的 PowerShell 中:
g++ main.cpp -o main.exe && .\main.exe
意思:
编译
↓
成功?
↓ 是
运行
所以算法题可以:
g++ -std=c++17 -O2 main.cpp -o main.exe && .\main.exe
一条命令完成:
编译 + 运行
; 和 && 的区别
&&
前一个成功
↓
才执行后一个
;
无论前一个成功还是失败
↓
都执行后一个
例如:
command1 ; command2
编译运行通常更适合:
g++ main.cpp -o main.exe && .\main.exe
三十七、查看 PATH
$env:Path
MinGW 的:
E:\mingw64\bin
通常应该在 PATH 中。
否则直接:
g++
可能无法找到命令。
三十八、临时添加 PATH
$env:Path += ";E:\mingw64\bin"
然后:
g++ --version
这种修改通常只对当前 PowerShell 会话有效。
三十九、查看 G++ 帮助
g++ --help
常用分类:
g++ --help=common
优化:
g++ --help=optimizers
警告:
g++ --help=warnings
四十、最值得记住的常用指令
编译
g++ main.cpp -o main.exe
多文件编译
g++ main.cpp log.cpp -o main.exe
编译所有 .cpp
g++ *.cpp -o main.exe
运行
.\main.exe
编译 + 运行
g++ main.cpp -o main.exe && .\main.exe
调试编译
g++ -g -O0 main.cpp -o main.exe
O2 优化
g++ -O2 main.cpp -o main.exe
开启警告
g++ -Wall -Wextra main.cpp -o main.exe
指定 C++ 标准
g++ -std=c++17 main.cpp -o main.exe
查看预处理结果
g++ -E -P main.cpp -o main.i
生成汇编
g++ -O2 -S -masm=intel main.cpp -o main.s
生成目标文件
g++ -c main.cpp
反汇编
objdump -d -M intel main.exe
查看版本
g++ --version
查找 g++
where.exe g++
四十一、常用参数速查表
| 参数 | 作用 |
|---|---|
-E | 只进行预处理 |
-S | 生成汇编代码 |
-c | 生成目标文件,不链接 |
-o | 指定输出文件 |
-O0 | 不进行优化 |
-O1 | 一级优化 |
-O2 | 二级优化 |
-O3 | 三级优化 |
-Os | 优化程序体积 |
-g | 添加调试信息 |
-Wall | 开启常用警告 |
-Wextra | 开启额外警告 |
-Wpedantic | 更严格的标准检查 |
-std=c++17 | 使用 C++17 |
-std=c++20 | 使用 C++20 |
-I | 添加头文件搜索路径 |
-D | 定义预处理宏 |
-L | 添加库搜索路径 |
-l | 链接指定库 |
-masm=intel | 使用 Intel 汇编语法 |
四十二、PowerShell 常用语法速查
| 命令 / 符号 | 作用 |
|---|---|
pwd | 查看当前位置 |
ls / dir | 查看文件 |
cd xxx | 进入目录 |
cd .. | 返回上一级 |
mkdir xxx | 创建目录 |
rm xxx | 删除文件 |
cp | 复制 |
mv | 移动 / 重命名 |
cat | 查看文件内容 |
cls | 清屏 |
.\xxx.exe | 运行当前目录程序 |
Ctrl + C | 终止程序 |
↑ / ↓ | 浏览历史命令 |
Tab | 自动补全 |
> | 覆盖式输出重定向 |
>> | 追加式输出重定向 |
2> | 错误输出重定向 |
| ` | ` |
&& | 前一命令成功后继续 |
; | 无论成功失败都继续 |
* | 通配符 |
四十三、核心记忆
G++ 编译流程:
源代码
main.cpp
│
│ -E
↓
预处理文件
main.i
│
│ -S
↓
汇编文件
main.s
│
│ -c
↓
目标文件
main.o
│
│ 链接
↓
可执行文件
main.exe
可以记成:
-E → 预处理
-S → 汇编
-c → 目标文件
-o → 输出文件
-O → Optimization(优化)
-g → Debug(调试信息)
-W → Warning(警告)
-I → Include(头文件路径)
-L → Library(库路径)
-l → link library(链接库)
-D → Define(定义宏)
其中最重要的是:
.cpp
│
├── -E → .i
│
├── -S → .s
│
├── -c → .o
│
└──────→ .exe
理解这套流程之后,再学习 Makefile、CMake、GDB、静态库、动态库,会容易很多。