最简单方式是g++ file1.cpp file2.cpp -o program,适用于小型项目;中大型项目宜分步编译(g++ -c生成.o)再链接,或用Makefile/CMake自动化构建。

直接用 g++ 一次性编译多个 .cpp 文件是最简单、最常用的方式,只要所有源文件都参与最终链接,就不用手动管 .o 文件。
一次性编译链接:g++ file1.cpp file2.cpp -o program
这是最直白的做法,适用于小型项目或快速验证。GCC 会自动完成预处理、编译、汇编、链接全过程。
- 所有
.cpp文件必须能互相引用(比如通过头文件声明 +#include),但不需要显式写extern;链接器会自动解析符号 - 顺序有影响:
main.cpp建议放第一个,尤其当其他文件定义了被main调用的函数时(虽多数情况不敏感,但保险起见) - 如果用了 C++11 或更高标准的特性(如
auto、std::thread),记得加-std=c++11或对应版本,否则可能报错 - Windows 下生成的是
program.exe,Linux/macOS 下是program(无后缀)
分步编译再链接:先 g++ -c,再 g++ *.o -o program
适合中大型项目,或者你想保留中间文件用于增量编译、调试、或打包静态库。
-
g++ -c main.cpp→ 生成main.o;g++ -c util.cpp→ 生成util.o;注意-c选项不能带-o指定可执行名,否则会出错 - 链接阶段只接受
.o、.a、.so等目标/库文件,不能混入.cpp;否则报错:cannot execute binary file或类似提示 - 若头文件路径不在当前目录,需加
-I./include,否则#include "xxx.h"会找不到 - Windows 下用
del *.o清理,Linux/macOS 用rm *.o;别在链接命令里漏掉某个.o,否则报undefined reference
常见错误:undefined reference to `xxx'
这不是语法错,而是链接阶段失败,90% 是因为函数声明了但没定义,或定义了但没参与链接。
- 检查是否漏编译某个
.cpp文件(比如写了g++ main.cpp -o app,但helper.cpp里的函数在main里调用了,却没把它加进命令) - 确认函数定义所在的
.cpp文件确实被编译进了目标文件(运行nm helper.o | grep your_func_name可查符号是否存在) - 避免在头文件里写函数实现(除非是
inline或模板),否则多个.cpp包含它会导致重复定义错误 - 静态成员变量必须在某个
.cpp文件里显式定义一次,光在头文件里static int x;不够
什么时候不该用 g++ *.cpp -o app
看似省事,但容易掩盖结构问题,尤其在协作或长期维护时。
- 项目有多个无关模块(比如同时含 GUI 和 CLI 入口),硬塞一起编译会冲突;应分开生成不同可执行文件
- 部分
.cpp实际是用来打静态库的(如libmath.a),不该直接参与主程序链接 - 目录结构复杂(如
src/、test/、third_party/),*.cpp会误抓不该编译的文件 - 你改了一个
.cpp,却每次全量重编——这时该上make或cmake,而不是靠手敲命令
真正麻烦的从来不是命令怎么写,而是搞不清哪些文件该进链接、哪些只是辅助构建、哪些根本不该出现。盯住符号表和依赖关系,比背命令重要得多。


















