最常见场景是用g++ main.cpp -o main直接编译运行单个文件;需注意指定输出名、c++标准(如-std=c++17)、main函数签名正确,且环境已安装并配置好g++。

用 g++ 直接编译单个 .cpp 文件
最常见场景:你写了一个 main.cpp,想立刻跑起来。只要系统装了 GCC 工具链,终端里一行命令就能搞定:
g++ main.cpp -o main
执行后生成可执行文件 main(Linux/macOS)或 main.exe(Windows MinGW)。注意三点:
-
-o后面必须跟输出文件名,不加它默认生成a.out(Unix-like)或a.exe(MinGW),容易覆盖 - 如果代码用了 C++11 以上特性(比如
auto、std::make_unique),得显式指定标准:g++ -std=c++17 main.cpp -o main - 报错如
undefined reference to 'main',大概率是没写int main(),或函数签名写成了void main()(非法)
多个源文件怎么一起编译链接
项目一变大,就会拆成 main.cpp、utils.cpp、utils.h 等。不能只编译一个文件——utils.cpp 里的函数在 main.cpp 中被调用,但没参与链接,就会报 undefined reference。
正确做法是把所有 .cpp 文件一起丢给 g++:
g++ main.cpp utils.cpp -o program
这样 g++ 会自动完成「编译 + 链接」两步。关键点:
- 头文件(
.h)不用列在命令里,只要#include路径正确(默认找当前目录和系统路径) - 如果
utils.cpp依赖第三方库(比如libjsoncpp),得加链接参数:-ljsoncpp,并确保库路径可用(必要时加-L/path/to/lib) - 顺序有影响:被依赖的源文件(如
utils.cpp)要放在依赖它的文件(如main.cpp)之后?不,g++对源文件顺序不敏感;但对-l参数敏感——库要放命令末尾,否则可能链接失败
遇到 “command not found: g++” 怎么办
不是代码问题,是环境没配好。先确认:
- Linux(Ubuntu/Debian):
sudo apt install build-essential - macOS:装 Xcode 命令行工具:
xcode-select --install;或用 Homebrew 装 LLVM:brew install llvm,然后用clang++替代(行为基本一致) - Windows:推荐安装 MinGW-w64 或使用 Visual Studio 的
cl.exe(但语法和链接规则不同,g++命令不可直接用)
装完验证:g++ --version。如果仍提示找不到,检查 PATH 是否包含编译器路径(如 /usr/bin 或 C:\mingw64\bin)。
为什么编译通过却运行崩溃
编译成功只代表语法和符号引用没问题,不代表逻辑安全。常见硬伤:
- 野指针或悬空引用:比如返回局部变量的地址、
delete后继续用指针 - 未初始化变量:尤其是
int、char*类型,值随机,行为不可预测 - 栈溢出:递归太深,或定义超大栈数组(如
int arr[1000000];) - 用
std::vector::at()越界会抛异常,但用[]不检查——崩溃往往就在这儿
建议加编译选项辅助排查:g++ -g -fsanitize=address,undefined main.cpp -o main,能捕获多数内存和未定义行为问题。
真正麻烦的是跨平台差异:比如 Windows 上 std::filesystem 需要 -lstdc++fs,而 macOS 不需要;又比如结构体字节对齐在不同编译器默认策略不同——这种细节不跑起来根本看不出。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











