日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

浅析Linux开发工具之gcc/g++

發(fā)布時間:2024/9/27 linux 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅析Linux开发工具之gcc/g++ 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在windows開發(fā)平臺,我們用慣了vc、vs等IDE(集成開發(fā)環(huán)境),在編譯好源代碼之后,按下相應(yīng)按鈕,IDE就會為我們完成編譯,鏈接的過程。然而在Linux平臺下,卻沒有這么方便的開發(fā)環(huán)境,很多事情都需要我們親力親為,為此我們要了解兩款編譯器:gcc/g++,它們分別是GNU的c/c++編譯器。
下面,來具體了解一下這兩款編譯器:
1、gcc/g++的安裝
在終端輸入兩條命令即可:
(1)安裝gcc
Debian系列:sudo apt-get install gcc
RedHat系列:sudo yum install gcc
(2)安裝g++
Debian系列:sudo apt-get install g++
RedHat系列:sudo yum install gcc-c++

PS:Debian系列的系統(tǒng)可以用一條命令:sudo apt-get install build-essential來安裝gcc、g++、make這一套工具。

2、gcc/g++的編譯過程
我們都知道,編寫好的源代碼在生成可執(zhí)行程序的過程中需要以下四步:預(yù)處理、匯編、編譯、鏈接,同樣的,我們的工具gcc/g++在為我們生成可執(zhí)行程序的過程中也經(jīng)歷了上述四步,下面我們來具體看看這四個執(zhí)行步驟。
下文圖片中出現(xiàn)的Makefile文件是我為了方便我的編譯創(chuàng)建的一個文件,不用理會。
這里以gcc舉例,g++與之類似,首先編寫源文件:

先用touch命令創(chuàng)建我們要編寫的源文件:

接著編輯源文件的內(nèi)容:

//tran.h 1 #include <stdio.h> 2 3 void tran(); //tran.c 1 #include "tran.h" 2 3 void tran() 4 { 5 printf("this is tran\n"); 6 } //test.c 1 #include "tran.h" 2 #define NUM 1234 3 4 int main() 5 { 6 printf("%d\n", NUM); 7 tran(); 8 return 0; 9 }

然后來看看文件編譯后的狀態(tài)(這兒只看test.c的,tran.c的與之相似,頭文件無法編譯)

(1)預(yù)處理,生成.i的文件
預(yù)處理:這個步驟為我們完成的工作是宏替換、頭文件展開、條件編譯、特殊符號的處理。使用的命令是:
gcc -E x.c -o x.i //這里的x指的是依賴的文件的文件名和要生成的文件名
-E:該選項(xiàng)的作用用是讓 gcc 在預(yù)處理結(jié)束后停止止編譯過程。
-o:指定生成的文件名。
例如:


可以看到這里已經(jīng)生成了一個名字為test.i的文件:

用cat命令看一下文件test.i的內(nèi)容:

可以看到,頭文件tran.h已經(jīng)被替換為上面那些亂七八槽的東西了,宏NUM也被替換為它對應(yīng)的數(shù)字1234。

(2)編譯,生成匯編文件.s
編譯程序,所要作的工作就是通過詞法分析、語義分析、符號匯總和語法分析,在確認(rèn)所有的指令都符合語法規(guī)則之后,將其翻譯成等價的中間代碼表示或匯編代碼。使用的命令是:
gcc -S x.i -o x.s //這里的x指的是依賴的文件的文件名和要生成的文件名
-S:該選項(xiàng)只進(jìn)行編譯而不進(jìn)行匯編,生成匯編代碼。
-o:指定生成的文件名
例如:


可以看到已經(jīng)生成了名為test.s的文件

用cat命令看一下test.s的內(nèi)容:

可以看到確實(shí)是生成了匯編代碼

(3)匯編,生成目標(biāo)文件 .o文件
匯編過程實(shí)際上指把匯編語言代碼翻譯成目標(biāo)機(jī)器指令的過程,也就是說把匯編代碼轉(zhuǎn)換為二進(jìn)制文件(即目標(biāo)文件),目標(biāo)文件中所存放的是與源程序等效的目標(biāo)的機(jī)器語言代碼。
目標(biāo)文件由段組成:一個目標(biāo)文件中至少有兩個段:
代碼段:主要包含的是程序的指令。該段一般是可讀、可執(zhí)行、不可寫。
數(shù)據(jù)段:主要存放程序中的全局變量或靜態(tài)的數(shù)據(jù)。一般數(shù)據(jù)段都是可讀、可執(zhí)行、可寫 。
這兒使用的命令是:
gcc -c x.s -o x.o
-c:將匯編代碼生成二進(jìn)制的目標(biāo)文件
-o:指定生成的文件名
例如:


可以看到已經(jīng)生成了文件tets.o

(4)鏈接,生成可執(zhí)行程序
由匯編程序生成的目標(biāo)文件并不能立即就被執(zhí)行,其中可能還有許多沒有解決的問題。例如,某個源文件中的函數(shù)可能引用了另一個源文件中定義的某個符號(如變量或者函數(shù)調(diào)用等);在程序中可能調(diào)用了某個庫文件中的函數(shù),等等。所有的這些問題,都需要經(jīng)鏈接程序的處理方能得以解決。

鏈接程序的主要工作就是將有關(guān)的目標(biāo)文件彼此相連接,也即將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的這些目標(biāo)文件成為一個能夠誒操作系統(tǒng)裝入執(zhí)行的統(tǒng)一整體。

根據(jù)開發(fā)人員指定的同庫函數(shù)的鏈接方式的不同,鏈接處理可分為兩種:
(1)靜態(tài)鏈接:在這種鏈接方式下,函數(shù)的代碼將從其所在地靜態(tài)鏈接庫中被拷貝到最終的可執(zhí)行程序中。這樣該程序在被執(zhí)行時這些代碼將被裝入到該進(jìn)程的虛擬地址空間中。靜態(tài)鏈接庫實(shí)際上是一個目標(biāo)文件的集合,其中的每個文件含有庫中的一個或者一組相關(guān)函數(shù)的代碼。(個人備注:靜態(tài)鏈接將鏈接庫的代碼復(fù)制到可執(zhí)行程序中,使得可執(zhí)行程序體積變大)
(2)動態(tài)鏈接:在此種方式下,函數(shù)的代碼被放到稱作是動態(tài)鏈接庫或共享對象的某個目標(biāo)文件中。鏈接程序此時所作的只是在最終的可執(zhí)行程序中記錄下共享對象的名字以及其它少量的登記信息。在此可執(zhí)行文件被執(zhí)行時,動態(tài)鏈接庫的全部內(nèi)容將被映射到運(yùn)行時相應(yīng)進(jìn)程的虛地址空間。動態(tài)鏈接程序?qū)⒏鶕?jù)可執(zhí)行程序中記錄的信息找到相應(yīng)的函數(shù)代碼。(個人備注:動態(tài)鏈接指的是需要鏈接的代碼放到一個共享對象中,共享對象映射到進(jìn)程虛地址空間,鏈接程序記錄可執(zhí)行程序?qū)硇枰玫拇a信息,根據(jù)這些信息迅速定位相應(yīng)的代碼片段。可移植性差)
這兒使用的命令是:
gcc -o x x1.o x2.o ……
這兒的-o后面的x是生成的可執(zhí)行程序的名稱,x1.o,x2.o……是所有需要被鏈接到一起的.o文件。
例如:

這兒省略了tran.o的生成過程


可以看到已經(jīng)生成了可執(zhí)行文件test

3、gcc/g++的選項(xiàng)擴(kuò)展
當(dāng)然,我們平時不用這么麻煩的一步步執(zhí)行下來,上面是為了展示一下gcc的編譯過程,平時我們在編譯.c文件時,直接使用命令:
gcc -o file file1.c file2.c ……
file是生成的可執(zhí)行程序的名字,file1.c,file2.c是要用到的源文件。

下面列出一些常見的gcc選項(xiàng):
1、-O0 -O1 -O2 -O3 譯器的優(yōu)化選項(xiàng)的4個級別,-O0表示示沒有優(yōu)化,-O1為缺省值,-O3優(yōu)化級別最高高
2、-w 不生生成任何警告信息
3、-Wall 生成所有警告信息。
4、-g 生成調(diào)試信息。GNU 調(diào)試器可利用用該信息。
5、-static 此選項(xiàng)將禁止使用動態(tài)庫,所以,編譯出來的東西,一般都很大。
6、-share 此選項(xiàng)將盡量使用動態(tài)庫,所以生成文件比較小,但是需要系統(tǒng)由動態(tài)庫。

總結(jié)

以上是生活随笔為你收集整理的浅析Linux开发工具之gcc/g++的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。