源程序只有经过编译和链接后才能成为可执行程序,这是编程开发中极为重要的一个环节。下面从编译、链接以及可执行程序的生成过程三个方面来详细阐述。
一、编译
编译是将源码转化为机器代码的过程。它是程序开发过程中必不可少的一步,也是将程序移植到不同操作系统和硬件平台的基础。对于一个庞大的程序来说,它可能由多个源程序文件组成,每个源程序文件都需要编译成一个 对象文件 。
C++代码示例:
//main.cpp文件
#include
using namespace std;
int main()
{
cout << "Hello World!" << endl;
return 0;
}
对于上述代码,使用g++编译器进行编译
g++ -c main.cpp
编译生成main.o文件
二、链接
链接是将多个对象文件以及所需要的库文件链接成一个可执行文件的过程。这个过程主要是由链接器(通常是ld)完成的,链接器会将多个对象文件中的符号进行合并,保留了函数和变量的定义和引用,生成一个二进制可执行文件。
C++代码示例:
//main.cpp文件
#include
using namespace std;
int main()
{
cout << "Hello World!" << endl;
return 0;
}
首先使用g++编译器进行编译,生成对象文件main.o,然后进行链接
g++ -o main main.o
链接生成可执行文件main
三、可执行程序的生成过程
当编译器将源代码编译为目标代码后,生成的文件并不能直接在计算机上运行,因为它仍然只是一个二进制文件。可执行程序需要进一步进行链接以及处理。可执行程序的生成过程会经历以下几个步骤:
- 预处理
- 编译
- 汇编
- 链接
接下来简单说明一下这几个步骤:
- 预处理:预处理器将头文件的信息插入到源代码中,并执行宏定义、文件包含等操作。预处理之后生成.i文件。
- 编译:编译器会将源文件转化为汇编代码,将C++或者其他高级语言翻译成汇编语言。编译之后生成.s文件(汇编代码文件)。
- 汇编:汇编器将汇编语言翻译成机器语言,并生成目标文件。
- 链接:链接器将多个目标文件以及库文件合并成一个可执行文件。在这个过程中,链接器会处理全局变量的重定位、多个文件之间的符号引用等问题。
C++代码示例:
//main.cpp文件
#include
using namespace std;
int main()
{
cout << "Hello World!" << endl;
return 0;
}
编译命令如下:
g++ -E main.cpp -o main.i #预处理:生成main.i文件
g++ -S main.i -o main.s #编译:生成main.s文件
as main.s -o main.o #汇编:生成main.o文件
g++ main.o -o main #链接:生成可执行文件main
生成可执行文件main
总结
源程序只有经过编译和链接后才能生成可执行程序。编译是将源代码转化为目标代码的过程,链接是将多个目标文件以及库文件合并成一个可执行文件的过程。