编译
GCC/g++
GCC(GNU Compiler Collection)是 GNU 的编译器套件,支持多种编程语言(C、C++、Objective-C、Fortran、Ada 等),而 g++ 是 GCC 中专门用于编译 C++ 代码的前端工具。以下是常用的 GCC 指令及与 g++ 的区别对比:
- GCC:编译 C 语言程序时,不会自动链接 C++ 标准库。必须显式链接
-lstdc++。 - G++ :自动链接 C++ 标准库,无需手动添加
-lstdc++,并且处理 C++ 语言特性,如函数重载和模板(进行名称修饰(name mangling))
1.编译可执行文件
gcc test.c -o output
g++ test.cpp -o output
gcc -I/path/include test.c -o output
2.仅编译不链接(生成目标.o文件)
gcc -c test.c -o output.o
3.启用调试信息
gcc -g test.c -o output.o
4.链接外部库
gcc test.c -lm -o output #链接数学库
c++程序编译
一句话总结
“C++编译分为预处理、编译、汇编、链接四个阶段,预处理展开宏和头文件,编译生成汇编代码,汇编转换为机器码,链接合并目标文件和库。通过 g++ 命令控制优化、警告和标准,静态/动态链接决定库的绑定方式。”
1. 编译流程(4个核心阶段)
-
预处理(Preprocessing)
- 处理
#开头的指令(如#include、#define),生成纯C++代码(.i文件)。 - 命令:
g++ -E main.cpp -o main.i
- 处理
-
编译(Compilation)
- 将预处理后的代码转换为汇编代码(
.s文件)。 - 语法分析、语义分析、优化等在此阶段完成。
- 命令:
g++ -S main.i -o main.s
- 将预处理后的代码转换为汇编代码(
-
汇编(Assembly)
- 将汇编代码转换为机器码(目标文件
.o) 。 - 命令:
g++ -c main.s -o main.o
- 将汇编代码转换为机器码(目标文件
-
链接(Linking)
- 合并多个目标文件(如
main.o、utils.o)和库文件(如libstdc++.a),生成可执行文件。 - 解决符号引用(如函数、全局变量)。
- 命令:
g++ main.o utils.o -o app
- 合并多个目标文件(如