C++编译基础¶
为什么C++需要编译?¶
C++是一种高级编程语言,它提供了丰富的特性来帮助开发者编写高效、灵活的程序。然而,计算机硬件只能理解和执行机器语言指令,即二进制代码。C++代码是人类可读的文本形式,需要转换成机器可执行的格式。这个过程就是编译。
编译器是将C++源代码转换成机器代码的软件工具。编译过程确保了代码的语法正确性、类型安全,并且优化了代码以提高执行效率。
编译流程¶
下面以g++
编译hello.cpp
文件为例,介绍编译的流程。
常见的C/C++编译器
常见的C/C++编译器主要有以下两种
- GCC(GNU Compiler Collection)是一个开源的编译器集合,支持多种编程语言,包括C和C++。
- gcc用于C语言的编译
- g++用于C++的编译(兼容C语言的编译)
- LLVM(Low Level Virtual Machine)是一个开源的编译器基础设施项目,由一系列的模块化和可重用的编译器组件构成,支持广泛的编程语言,包括但不限于C、C++。
- clang用于C语言的编译
- clang++用于C++的编译(兼容C语言的编译)
- 预处理阶段(Preprocessing):
- 移除注释。
- 处理预处理指令,如
#include
和宏定义,生成预处理文件(.i)g++ –E hello.cpp –o hello.i
- 编译阶段(Compilation):
- 将预处理后的代码转换成汇编语言,生成汇编文件(.s)
g++ –S hello.i –o hello.s
- 将预处理后的代码转换成汇编语言,生成汇编文件(.s)
- 汇编阶段(Assembly):
- 将汇编语言转换成机器代码,生成二进制文件(.o)
g++ –c hello.s –o hello.o
- 将汇编语言转换成机器代码,生成二进制文件(.o)
- 链接阶段(Linking):
- 将编译生成的目标文件与库文件链接在一起,生成可执行文件。
g++ hello.o –o hello
- 将编译生成的目标文件与库文件链接在一起,生成可执行文件。
上述四个步骤也可以直接一步完成
g++ hello.cpp -o hello
安装GCC
在大多数Linux发行版中,GCC已经预装。如果没有,可以通过包管理器安装:
sudo apt-get install build-essential # Debian/Ubuntu
sudo yum install gcc-c++ # CentOS/Fedora
编译实战¶
-
编写源代码: 创建如下三个文件:
#include "test.h" int main(){ hellon(3); hello_n(1); return 0; }
#include<stdio.h> void hellon(int);
#include "test.h" static void inline hello(); void hellon(int n){ for(int i=0;i<n;i++){ hello(); } } static void inline hello(){ printf("hello,world\n"); }
-
编译源代码: 使用以下命令编译:
gcc test.c main.c -o main
-
运行程序: 编译完成后,可以通过以下命令运行程序:
./main
分步编译
尝试使用gcc分步编译上述三个文件:
- 先将两个.c文件编译为对应的.o文件
- 再使用gcc将这两个文件链接得到可执行文件main
思考题
上述步骤中printf
函数的实现代码是否被编译了,如果没有,为什么最后可以成功调用printf
函数