銷項稅和進項導入是在國稅網(wǎng)站做嗎制作網(wǎng)站費用
目錄
一,gcc簡介
二,C語言源文件的編譯過程
1.預處理
2.編譯
3.匯編
?4.鏈接
5.動靜態(tài)庫?
一,gcc簡介
相信有不少的小白和我一樣在學習Linux之前只聽說過visual? studio。其實這個gcc這個編譯器實現(xiàn)的功能便是和visual studio一樣的功能,但是gcc只能夠支持c語言。如果要支持C++的話便要用到g++。
二,C語言源文件的編譯過程
1.預處理
在C源文件運行時做的第一步便是預處理,在預處理的過程中要做的便是:
1.頭文件展開。
2.去掉注釋。
3.條件編譯。
4.宏替換。
這上面的四步便是預處理時要做的四步。那我們在Linux中要如何的去觀察這一個過程呢?這個時候便要使用到一個Linux的指令了。這個指令便是——gcc -E:代表的意思便是開始編譯C源文件等到預處理結(jié)束以后便停止翻譯??梢詠矶未a來看看效果。如以下代碼:
#include<stdio.h> //頭文件2 #define M 123 //宏定義3 #define v1 1 4 #define v2 0 5 #define v3 0 6 int main() 7 { 8 printf("hello Linux:%d \n",M); 9 printf("hello C++ :%d \n",M); 10 11 // printf("hello Linux:%d \n",M);//注釋 12 // printf("hello C++ :%d \n",M); 13 // 14 // printf("hello Linux:%d \n",M); 15 // printf("hello C++ :%d \n",M); 16 17 #if(v1) //條件編譯 18 printf("普通版本\n"); 19 #elif(v2) 20 printf("會員版本\n"); 21 #else 22 printf("超級會員版本\n"); 23 #endif 24 25 return 0 ; 26 }
當我執(zhí)行如下指令時:gcc -E texe2.c -o code.i。當我們輸入這條指令時便會得到一個code.i文件。當用vim進到這個文件里面是便會看到頭文件被展開了,宏被替換掉了,注釋被刪掉了,預處理指令只有條件成立的那一部分被留下來。
2.編譯
這個編譯便是代碼翻譯的第二步,在這個過程中我們要做的便是將英文代碼變成匯編代碼。在Linux 系統(tǒng)下輸入gcc -S ,這條指令便可以生成一個經(jīng)過編譯后的匯編文件。比如對上述的code.i文件進行編譯-gcc -S code.i -o code.s,便會得到這樣一個匯編文件:
這樣子便將c源文件給弄成了匯編文件了。
3.匯編
在這個過程中要做到的便是將匯編文件翻譯為重定向的二進制文件。在Linux系統(tǒng)下輸入指令:gcc -c便可。如對上述的code.s文件進行翻譯便可以輸入指令-code -c code.s -o code.o。在執(zhí)行完這個指令以后便會形成一個code.o文件。用vim打開該文件便會是這樣一個光景:
因為vim是文本編輯器,但是code.o文件卻是二進制文件所以就會出現(xiàn)這樣的錯誤。要打開二進制文件要調(diào)用另一個指令——od。打開后便是這樣的:
我們自然是看不懂的,但是計算機就能看懂。在進行到這一步以后一個二進制文件也就是目標文件便生成了。但是此時我們還不能運行。
?4.鏈接
生成目標文件以后,如果要運行的話便要經(jīng)過鏈接這一步。經(jīng)過了鏈接這一步以后代碼才可以變成一個可執(zhí)行文件。在Linux環(huán)境下就是輸入指令gcc 。對于上述的code.o文件也就是輸入指令 ——gcc code.o -o mybin:
5.動靜態(tài)庫?
1.庫的分類
其實可執(zhí)行文件 = 頭文件+代碼+庫。在這里頭文件相當于一個功能函數(shù)聲明的集合,代碼就是我們調(diào)用功能函數(shù)的指令,庫便是各種功能函數(shù)的定義。在這里的庫便分為兩種庫,一種叫做動態(tài)庫,一種叫做靜態(tài)庫。動態(tài)庫的后綴是so,靜態(tài)庫的后綴是.a。在Linux環(huán)境下輸入指令ls /usr/lib64/libc.so.6便可以查看這個動態(tài)庫。
得到這個藍色的路徑便是動態(tài)庫的路徑。lib表示庫,c表示動態(tài)庫的名字,so表示是動態(tài)庫,6表示版本。
2.鏈接方式
在Linux中有兩種鏈接方式。一種是動態(tài)連接方式,一種是靜態(tài)鏈接方式。這兩種不同的鏈接方式各自有各自的優(yōu)點。動態(tài)鏈接形成的可執(zhí)行程序比較小,靜態(tài)鏈接形成的可執(zhí)行序比較大。這兩種差別是因為這兩種鏈接調(diào)用庫中功能函數(shù)的方式的不同導致的。
1.動態(tài)鏈接是通過函數(shù)的地址來調(diào)用的,靜態(tài)鏈接是通過將函數(shù)拷貝到可執(zhí)行文件中來調(diào)用的。
2.動態(tài)庫的函數(shù)調(diào)用會受到動態(tài)庫的存在與否影響,但是靜態(tài)庫則不受這個影響。
?