源程序只有經過編譯和鏈接後才能成為可執行程序,這是編程開發中極為重要的一個環節。下面從編譯、鏈接以及可執行程序的生成過程三個方面來詳細闡述。
一、編譯
編譯是將源碼轉化為機器代碼的過程。它是程序開發過程中必不可少的一步,也是將程序移植到不同操作系統和硬件平台的基礎。對於一個龐大的程序來說,它可能由多個源程序文件組成,每個源程序文件都需要編譯成一個 對象文件 。
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
總結
源程序只有經過編譯和鏈接後才能生成可執行程序。編譯是將源代碼轉化為目標代碼的過程,鏈接是將多個目標文件以及庫文件合併成一個可執行文件的過程。
原創文章,作者:MJZWD,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/373844.html