Administrator
发布于 2026-09-28 / 20 阅读
0

终端常用指令速查

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、静态库、动态库,会容易很多。