g++是编译C++文件的首选,因其自动链接libstdc++等C++标准库;而gcc虽能编译.cpp文件,但默认按C规则处理、不链接C++库,导致链接时报“undefined reference”错误,需手动加-lstdc++且易遗漏其他运行时依赖。

直接用 g++ 编译 C++ 文件是最稳妥的选择,不用纠结选 gcc 还是 g++ —— 后者会自动链接 C++ 标准库,前者不会。
为什么必须用 g++ 而不是 gcc
即使源文件是 .cpp 后缀,gcc 也会按 C 语言规则处理:它不链接 libstdc++,也不识别 C++ 特有符号(比如 std::string 的构造函数)。结果就是链接时报错:undefined reference to `operator new(unsigned long)' 或类似提示。
-
g++ main.cpp -o app→ 正常链接libstdc++,能跑 -
gcc main.cpp -o app→ 编译可能通过,但链接失败 - 强行用
gcc补救?得手动加-lstdc++,还可能漏掉其他 C++ 运行时依赖,不推荐
g++ 常见编译模式与对应命令
不同阶段需要不同参数组合,别全堆在一行里硬记:
- 只生成可执行文件(一步到位):
g++ -std=c++17 -O2 main.cpp -o app - 只到目标文件(适合多文件项目):
g++ -c -std=c++20 util.cpp -o util.o - 只到汇编代码(查优化效果):
g++ -S -O3 main.cpp -o main.s - 只预处理(看宏展开/头文件嵌套):
g++ -E main.cpp > main.ii
注意:-std= 必须显式指定,否则默认行为因 GCC 版本而异(GCC 11+ 默认 c++17,但老版本可能是 c++98)。
立即学习“C++免费学习笔记(深入)”;
容易被忽略的链接陷阱
当项目含多个 .cpp 文件或调用第三方库时,常见错误不是语法问题,而是链接顺序和库依赖没理清:
- 多个源文件一起编译:
g++ main.cpp helper.cpp -o app—— 不要分两次-c再手动g++ *.o,除非你真需要控制中间过程 - 链接静态库:
g++ main.cpp -L./lib -lmylib -o app,其中-L指定路径,-l名称去掉lib前缀和.a后缀 - 混用 C 和 C++ 代码:
extern "C"声明必须出现在 C++ 头文件里,且 C 文件仍要用gcc编译(或统一用g++加-x c强制识别)
最隐蔽的问题:C++20 模块(.mxx)目前 GCC 支持有限,别在生产环境贸然启用 -fmodules,容易卡在预编译头或依赖解析上。


















