国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Linux】基礎(chǔ)開發(fā)工具——gcc/g++篇

這篇具有很好參考價(jià)值的文章主要介紹了【Linux】基礎(chǔ)開發(fā)工具——gcc/g++篇。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

【Linux】基礎(chǔ)開發(fā)工具——gcc/g++篇,Linux,linux,運(yùn)維,服務(wù)器,gcc,g++,動態(tài)庫,靜態(tài)庫

前言
?在前面的文章里給大家介紹了vim的使用方法,學(xué)會了vim之后就可以進(jìn)行代碼的編寫工作,但vim僅僅只是一款文本編輯器,要想讓我們的代碼運(yùn)行起來,還需要使用今天給大家介紹的編譯工具:gcc/g++。其中g(shù)cc是針對C語言的編譯器,g++是針對C++的編譯器,他倆在使用形式上是相同的,所以今天主要以gcc為主,給大家介紹一下它們的使用方法,讓大家快速上手。
?編譯主要分為預(yù)處理、編譯、匯編、鏈接四個(gè)過程,下面將結(jié)合這四個(gè)具體過程,來介紹gcc的使用,同時(shí)會穿插介紹一些提升我們內(nèi)功的邊緣知識。

一、預(yù)處理

  • 預(yù)處理的主要功能主要包括宏替換、頭文件展開、條件編譯、去注釋等。
  • 預(yù)處理指令都是以#開頭的代碼行。
  • 指令:gcc -E test.c -o test.i
  • -E:讓gcc在預(yù)處理結(jié)束后停止編譯過程。
  • -o:將當(dāng)前編譯結(jié)果寫入到test.i文件中,.i文件為經(jīng)過預(yù)處理的C源程序(注意:此時(shí)還是源程序)。

【Linux】基礎(chǔ)開發(fā)工具——gcc/g++篇,Linux,linux,運(yùn)維,服務(wù)器,gcc,g++,動態(tài)庫,靜態(tài)庫

1.1 頭文件展開

?頭文件展開,就是把頭文件中的內(nèi)容拷貝到當(dāng)前的源代碼中,這就意味著,在編譯之前,系統(tǒng)中必須得有這個(gè)頭文件,那我怎么知道系統(tǒng)中有沒有呢?其實(shí)完全不用擔(dān)心,頭文件屬于開發(fā)環(huán)境的一部i分,在Windows環(huán)境中,我們使用的vs、dev等都叫做集成開發(fā)環(huán)境,集代碼編寫、編譯于一體,我們在下載這些工具的時(shí)候,會選擇一個(gè)開發(fā)包,這其實(shí)就是下載C有關(guān)的頭文件和庫文件。而Linux環(huán)境是專門供程序員使用的,所以在大多數(shù)Linux環(huán)境下,與開發(fā)環(huán)境有關(guān)的東西,如:代碼編輯器、代碼編譯器、頭文件/庫文件等,都已經(jīng)提前幫我們準(zhǔn)備好了,我們可以直接開始寫代碼。
?/usr/include/目錄是Linux下gcc/g++頭文件的默認(rèn)搜索路徑,該路徑下有許多和開發(fā)相關(guān)的頭文件。
【Linux】基礎(chǔ)開發(fā)工具——gcc/g++篇,Linux,linux,運(yùn)維,服務(wù)器,gcc,g++,動態(tài)庫,靜態(tài)庫

1.2 條件編譯

?條件編譯,在我們平時(shí)寫代碼時(shí)似乎很少出現(xiàn),但是它的作用我們可千萬不能忽視。想必大家在下載一些軟件的時(shí)候,會出現(xiàn)社區(qū)版、專業(yè)版等,一般而言,社區(qū)版的軟件會比專業(yè)版的少一些功能。少的這些功能就是通過條件編譯裁剪掉的,如果沒有條件編譯,那針對每一個(gè)版本,廠商都需要寫一份對應(yīng)的代碼,那在維護(hù)的時(shí)候就非常麻煩,很可能會出現(xiàn)對社區(qū)版的修改了,而對專業(yè)版的沒改。但是有了條件編譯,廠商從始至終只需要維護(hù)一份代碼即可,對于社區(qū)版只要對專業(yè)版的代碼進(jìn)行條件編譯,裁剪掉相應(yīng)的功能即可。

小Tips:預(yù)處理后得到的.i文件任然是C語言,只不過和我們的源碼相比變得更干凈了而已。

二、編譯

  • 在這個(gè)階段,gcc首先首先要檢查代碼的規(guī)范性,是否有語法錯(cuò)誤,以確定代碼實(shí)際要做的工作,在檢查無誤后,gcc把代碼翻譯成匯編語言。
  • 指令:gcc -S test.i -o test.s

【Linux】基礎(chǔ)開發(fā)工具——gcc/g++篇,Linux,linux,運(yùn)維,服務(wù)器,gcc,g++,動態(tài)庫,靜態(tài)庫

三、匯編

  • 匯編階段是把編譯生成的.s文件中的匯編指令轉(zhuǎn)換成機(jī)器可以識別的二進(jìn)制,這個(gè)二進(jìn)制文件也被叫做可重定位目標(biāo)二進(jìn)制文件,簡稱目標(biāo)文件。
  • 指令:gcc -c test.s -o test.o

【Linux】基礎(chǔ)開發(fā)工具——gcc/g++篇,Linux,linux,運(yùn)維,服務(wù)器,gcc,g++,動態(tài)庫,靜態(tài)庫

四、鏈接

  • 鏈接階段是將目標(biāo)文件和庫文件進(jìn)行鏈接,形成可執(zhí)行程序
  • 指令:gcc test.o -o mytest

【Linux】基礎(chǔ)開發(fā)工具——gcc/g++篇,Linux,linux,運(yùn)維,服務(wù)器,gcc,g++,動態(tài)庫,靜態(tài)庫
?有時(shí)候,我們會在程序當(dāng)中引用、調(diào)用其他的外部子程序,或者是利用其他軟件提供的函數(shù)功能,這個(gè)時(shí)候,我們就必須要在編譯過程中將該函數(shù)庫加進(jìn)去,如此一來,編譯器就可以將所有的程序代碼與函數(shù)庫做一個(gè)鏈接,以生成正確的執(zhí)行文件。

4.1 什么是庫?

?上面提到了庫和庫函數(shù)的概念。舉個(gè)簡單例子:大家在最開始學(xué)習(xí)C語言的時(shí)候,一定用過printf函數(shù),來向顯示器上打印一串字符,當(dāng)時(shí)我們只知道,只要在我們代碼的開頭寫上一句#include <stdio.h>,printf就能使用了?,F(xiàn)在我們知道stdio.h是一個(gè)頭文件,里面放的都是一些聲明,因?yàn)檫@個(gè)頭文件里有printf函數(shù)的聲明,所以包上它后,我們就能去使用printf這個(gè)函數(shù)。printf的具體實(shí)現(xiàn)方法其實(shí)是放在庫中的,可以這么說:庫給我們提供方法的實(shí)現(xiàn),庫其實(shí)就是把源文件,經(jīng)過一定的翻譯,然后打包,只給用戶提供一個(gè)文件,不用給我們提供太多的源文件,也可以達(dá)到隱藏源文件的目的,同時(shí),庫也避免了程序員自己去造輪子。所以這里的printf就是我們所說的庫函數(shù)。鏈接階段就是把我們寫的源代碼編譯得到的目標(biāo)文件與庫進(jìn)行鏈接,因?yàn)槲覀冇玫氖荂語言,所以默認(rèn)鏈接的是C語言標(biāo)準(zhǔn)庫。庫本質(zhì)上是一個(gè)文件,存在系統(tǒng)的特定目錄下。絕大多數(shù)的函數(shù)庫都放在/usr/lib/lib目錄下。
【Linux】基礎(chǔ)開發(fā)工具——gcc/g++篇,Linux,linux,運(yùn)維,服務(wù)器,gcc,g++,動態(tài)庫,靜態(tài)庫
?上圖展示的libc.so.6就是C語言的標(biāo)準(zhǔn)庫。

4.2 庫的分類

?庫分為兩類:動態(tài)庫靜態(tài)庫。其中Linux環(huán)境下,動態(tài)庫的后綴是.so,靜態(tài)庫的后綴是.a。在Windows環(huán)境下,動態(tài)庫的后綴是.dll,靜態(tài)庫的后綴是.lib。所有的庫文件,都遵守相同的命名規(guī)則,即:libname.后綴.xxx。
小Tips:gcc編譯器會默認(rèn)找到C的標(biāo)準(zhǔn)庫,它會把我們寫的源代碼經(jīng)過編譯得到的目標(biāo)文件與庫文件進(jìn)行鏈接。這也是為什么gcc不能去編譯C++的源文件,因?yàn)間cc默認(rèn)找的是C的標(biāo)準(zhǔn)庫,它找不到C++的庫。

4.3 目標(biāo)文件和庫是如何鏈接的?

?總體上,鏈接分為兩類:動態(tài)鏈接靜態(tài)鏈接。

4.3.1 動態(tài)鏈接

?將目標(biāo)文件與動態(tài)庫進(jìn)行鏈接,就叫做動態(tài)鏈接。動態(tài)庫就像是一個(gè)網(wǎng)吧,任何人想上網(wǎng)了,都可以去到這個(gè)網(wǎng)吧里。即:動態(tài)庫是被所有程序所共享的,一般也被叫做共享庫。這意味著,動態(tài)庫只需要一個(gè)就夠了,它可以滿足所有程序的需求。
?動態(tài)庫共享的特點(diǎn),導(dǎo)致動態(tài)庫不能丟失,就像網(wǎng)吧被查封了,人們就不能去上網(wǎng)一樣。一旦對應(yīng)的動態(tài)庫丟失,影響的不只是一個(gè)程序,可能會導(dǎo)致多個(gè)程序都無法正常運(yùn)行。

  • 指令ldd 可執(zhí)行程序,可以查看一個(gè)可執(zhí)行程序所依賴的動態(tài)庫。

【Linux】基礎(chǔ)開發(fā)工具——gcc/g++篇,Linux,linux,運(yùn)維,服務(wù)器,gcc,g++,動態(tài)庫,靜態(tài)庫
?Linux中,編譯形成可執(zhí)行程序,優(yōu)先采用動態(tài)鏈接。

4.3.2 靜態(tài)鏈接

?將目標(biāo)文件與靜態(tài)庫進(jìn)行鏈接,就叫做靜態(tài)鏈接。靜態(tài)庫就像電腦商城,當(dāng)有人有上網(wǎng)需求時(shí),會到電腦商城去買一臺專屬的電腦,只供自己使用。在編譯器使用靜態(tài)庫進(jìn)行靜態(tài)鏈接的時(shí)候,會將自己的方法拷貝到目標(biāo)程序中,該程序以后不再依賴靜態(tài)庫。

  • gcc test.c -o mytest-static -static
  • 其中-static表示執(zhí)行靜態(tài)鏈接,前提是有靜態(tài)庫。
  • yum install -y glibc-static:安裝C靜態(tài)庫

【Linux】基礎(chǔ)開發(fā)工具——gcc/g++篇,Linux,linux,運(yùn)維,服務(wù)器,gcc,g++,動態(tài)庫,靜態(tài)庫
?gcc默認(rèn)優(yōu)先使用動態(tài)庫,如果我們沒有動態(tài)庫,只有靜態(tài)庫,也是可以的,-static的本質(zhì)就是改變優(yōu)先級。鏈接的過程,不一定是純的全是動態(tài)鏈接或者靜態(tài)鏈接,二者可以同時(shí)出現(xiàn),但是如果加了-static選項(xiàng),那么會把所有的鏈接都變成靜態(tài)鏈接。

  • file mytest:查看mytest這個(gè)可執(zhí)行程序采用的是什么鏈接。

【Linux】基礎(chǔ)開發(fā)工具——gcc/g++篇,Linux,linux,運(yùn)維,服務(wù)器,gcc,g++,動態(tài)庫,靜態(tài)庫

4.4 動靜態(tài)鏈接的優(yōu)缺點(diǎn)對比

優(yōu)點(diǎn) 缺點(diǎn)
動態(tài)庫 有效的節(jié)省資源(磁盤空間、內(nèi)存空間、網(wǎng)絡(luò)空間等) 一旦缺失,所有程序都無法運(yùn)行
靜態(tài)庫 不依賴庫,編譯成功的可執(zhí)行程序,可以獨(dú)立執(zhí)行,不需要再向外部要求讀取庫函數(shù)中的內(nèi)容 體積大,比較消耗資源

【Linux】基礎(chǔ)開發(fā)工具——gcc/g++篇,Linux,linux,運(yùn)維,服務(wù)器,gcc,g++,動態(tài)庫,靜態(tài)庫

五、Debug&&release

?Debug是開發(fā)者模式,而用戶最終使用的是release。Debug模式下的代碼,可以被追蹤、調(diào)試,因?yàn)樵贒ebug模式下形成的可執(zhí)行程序,里面添加了debug信息。這意味著,以Debug模式下得到的可執(zhí)行程序,一定比release模式下得到的可執(zhí)行程序要大。
?gcc編譯器,默認(rèn)是以release的模式編譯得到可執(zhí)行程序,要在Debug模式下,編譯得到可執(zhí)行程序,需要加-g選項(xiàng),如下:

  • gcc test.c -o mytest-Debug -g

【Linux】基礎(chǔ)開發(fā)工具——gcc/g++篇,Linux,linux,運(yùn)維,服務(wù)器,gcc,g++,動態(tài)庫,靜態(tài)庫

  • readelf -S mytest:把對應(yīng)的可執(zhí)行程序以段的形式讀取出來。
  • readelf -S mytest-Debug | grep debug:篩選出與Debug有關(guān)的段。

【Linux】基礎(chǔ)開發(fā)工具——gcc/g++篇,Linux,linux,運(yùn)維,服務(wù)器,gcc,g++,動態(tài)庫,靜態(tài)庫


?今天的分享到這里就結(jié)束啦!如果覺得文章還不錯(cuò)的話,可以三連支持一下,您的支持就是春人前進(jìn)的動力!
【Linux】基礎(chǔ)開發(fā)工具——gcc/g++篇,Linux,linux,運(yùn)維,服務(wù)器,gcc,g++,動態(tài)庫,靜態(tài)庫文章來源地址http://www.zghlxwxcb.cn/news/detail-553396.html

到了這里,關(guān)于【Linux】基礎(chǔ)開發(fā)工具——gcc/g++篇的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 『Linux升級路』基礎(chǔ)開發(fā)工具——gcc/g++篇

    『Linux升級路』基礎(chǔ)開發(fā)工具——gcc/g++篇

    ?? 博客主頁: 小王又困了 ?? 系列專欄: Linux ?? 人之為學(xué),不日近則日退? ?? 感謝大家點(diǎn)贊??收藏?評論?? 目錄 一、快速認(rèn)識gcc/g++ ?二、預(yù)處理 ??1.1頭文件展開? ??1.2條件編譯 二、編譯 三、匯編 四、鏈接 ??4.1庫的概念 ??4.2庫的特點(diǎn) ??4.3庫的分類 ??4.4動態(tài)

    2024年02月05日
    瀏覽(23)
  • 【Linux環(huán)境基礎(chǔ)開發(fā)工具】編譯器-gcc/g++

    【Linux環(huán)境基礎(chǔ)開發(fā)工具】編譯器-gcc/g++

    上一篇博客, 我們學(xué)習(xí)了vim編輯工具,學(xué)會了怎么寫代碼, 這篇文章,我將分享代碼該怎么編譯的問題。 目錄 寫在前面: 1. gcc和g++介紹 2. gcc是如何編譯程序的 1. 預(yù)處理 2. 編譯 3. 匯編 4. 鏈接 3. gcc的選項(xiàng)介紹 4. 我們使用的函數(shù)是哪來的 5. 我們的.o文件和庫是如何鏈接的?

    2024年02月10日
    瀏覽(59)
  • Linux:基礎(chǔ)開發(fā)工具之yum,vim,gcc的使用

    Linux:基礎(chǔ)開發(fā)工具之yum,vim,gcc的使用

    本篇主要總結(jié)的是Linux下開發(fā)工具 yum vim gcc/g++ 什么是yum? 不管是在手機(jī)移動端還是 pc 端,不管是什么操作系統(tǒng),當(dāng)用戶想要下載一些內(nèi)容或者工具的時(shí)候,都需要到一個(gè)特定的位置進(jìn)行下載,例如在手機(jī)上,要下載一些應(yīng)用的時(shí)候就可以去對應(yīng)的應(yīng)用商店下載 而在Linux系統(tǒng)

    2024年02月08日
    瀏覽(50)
  • Linux基礎(chǔ)環(huán)境開發(fā)工具的使用(yum,vim,gcc,g++)

    Linux基礎(chǔ)環(huán)境開發(fā)工具的使用(yum,vim,gcc,g++)

    首先先說明一點(diǎn): Centos系統(tǒng)適用于yum 而Ubanto適用于apt-get 在Linux中我們也要進(jìn)行工具/程序/指令的安裝,檢查和卸載, 而我們安裝軟件的方式: 1.源代碼安裝-需要進(jìn)行交叉編譯的工作 一般那些很強(qiáng)的程序員中的大佬才能拿捏 2.rpm包直接安裝,也很麻煩 3.yum直接安裝 這就需要用到y(tǒng)

    2024年02月06日
    瀏覽(52)
  • 【Linux】Linux環(huán)境基礎(chǔ)開發(fā)工具的使用 ———(yum、vim、gcc&g++、gdb、make/Makefile、進(jìn)度條 、git)

    【Linux】Linux環(huán)境基礎(chǔ)開發(fā)工具的使用 ———(yum、vim、gcc&g++、gdb、make/Makefile、進(jìn)度條 、git)

    (???(??? )??,我是 Scort ?? ??博客主頁:張小姐的貓~江湖背景?? 快上車??,握好方向盤跟我有一起打天下嘞! 送給自己的一句雞湯??: ??集中起來的意志可以擊穿頑石?? ??作者水平很有限,如果發(fā)現(xiàn)錯(cuò)誤,可在評論區(qū)指正,感謝?? ????歡迎持續(xù)關(guān)注!????

    2024年01月16日
    瀏覽(59)
  • Linux開發(fā)工具:gcc和g++

    Linux開發(fā)工具:gcc和g++

    目錄 一.?什么是gcc和g++ 二. gcc的基本使用方法 三. 庫和鏈接 3.1 動態(tài)庫和靜態(tài)庫 3.2?動態(tài)鏈接和靜態(tài)鏈接 四. Debug和Release 五.?makefile和make 六.?總結(jié)? gcc:Linux下編譯C語言程序的編譯器 g++:Linux下編譯C++代碼的編譯器 由于C++兼容C語言,因此g++既可以編譯C++也可以編譯C語言。

    2024年02月07日
    瀏覽(20)
  • Linux 開發(fā)工具vim、gcc/g++、makefile

    Linux 開發(fā)工具vim、gcc/g++、makefile

    目錄 Linux編輯器-vim 1. 基本概念 2. 基本操作 3. 正常模式命令集 4. 末行模式命令集 5. 其他操作 6. 簡單vim配置 Linux編譯器-gcc/g++ 1、基本概念? 2、程序翻譯的過程 3. gcc如何完成程序翻譯 4、動靜態(tài)庫? Linux項(xiàng)目自動化構(gòu)建工具-make/Makefile 1、背景 2、創(chuàng)建makefile 3、原理 5、項(xiàng)目清

    2024年03月11日
    瀏覽(24)
  • 【嵌入式】Linux開發(fā)工具arm-linux-gcc安裝及使用

    【嵌入式】Linux開發(fā)工具arm-linux-gcc安裝及使用

    宿主機(jī) 執(zhí)行編譯、鏈接嵌入式軟件的計(jì)算機(jī) 目標(biāo)機(jī) 運(yùn)行嵌入式軟件的硬件平臺 “本地”編譯器 用來生成在與編譯器本身所在的計(jì)算機(jī)和操作系統(tǒng)(平臺)相同的環(huán)境下運(yùn)行的目標(biāo)代碼,例如 Windows 環(huán)境生成 Windows 目標(biāo)代碼。 交叉編譯器 用來生成在其它平臺上運(yùn)行的目標(biāo)代

    2024年01月17日
    瀏覽(50)
  • Linux開發(fā)工具:yum、vim、gcc/g++、makefile

    Linux開發(fā)工具:yum、vim、gcc/g++、makefile

    在 Linux 下安裝軟件一共有三種方式: 源代碼安裝 有很多開源軟件的源代碼會被作者放在Github/Gitee 等網(wǎng)站上, 可以將這些源代碼下載在本地. 通過直接在本地將這些源代碼進(jìn)行編譯鏈接生成可執(zhí)行程序 . 在嵌入式編程中, 經(jīng)常用到交叉編譯來處理不同平臺的適配性. rpm包直接安裝

    2024年01月19日
    瀏覽(32)
  • Linux開發(fā)工具-vim-gcc-gdb指令及使用

    Linux開發(fā)工具-vim-gcc-gdb指令及使用

    目錄 linux軟件包管理器yum(apt) linux開發(fā)工具 linux編輯器-vim使用 linux編譯器-gcc/g++使用 linux調(diào)試器-gdb使用 linux項(xiàng)目自動化構(gòu)建工具-make/makefile linux第一個(gè)小程序-進(jìn)度條 使用github創(chuàng)建項(xiàng)目 使用git命令 我們前面學(xué)了關(guān)于linux的基本指令和基本權(quán)限的一些相關(guān)知識,那么我們今天

    2024年03月10日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包