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

Linux的編譯器——gcc/g++(預(yù)處理、編譯、匯編、鏈接)

這篇具有很好參考價值的文章主要介紹了Linux的編譯器——gcc/g++(預(yù)處理、編譯、匯編、鏈接)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言:
本文主要認(rèn)識與學(xué)習(xí)Linux環(huán)境下常用的編譯器——gcc(編譯C代碼)/g++(編譯C++代碼)的常用指令等、程序?qū)崿F(xiàn)的兩大環(huán)境、動態(tài)庫與靜態(tài)庫的理解等。

一.程序?qū)崿F(xiàn)的兩個環(huán)境

任何一個C程序的實現(xiàn)都要經(jīng)過翻譯環(huán)境執(zhí)行環(huán)境

在翻譯環(huán)境中又分為4個部分,預(yù)編譯、編譯、匯編與鏈接。在各個階段主要完成的任務(wù)有:

  1. 預(yù)編譯(預(yù)處理):頭文件的包含、注釋的刪除、#define符號的替換
  2. 編譯:將C語言代碼轉(zhuǎn)化為匯編代碼
  3. 匯編:把匯編指令轉(zhuǎn)化為二進制指令
  4. 鏈接:合并符號表和段表,生成可執(zhí)行程序

Linux的編譯器——gcc/g++(預(yù)處理、編譯、匯編、鏈接),linux,匯編,c++

二.gcc如何完成

通過gcc指令的不同選項可查看各階段所形成的文件

格式:gcc [選項] [目標(biāo)文件名] -o [生成文件名]

首先在Test.c文件中寫好C代碼:

//Test.c
#include<stdio.h>
 
#define N 100
 
//這是一段注釋.....
 
int main()
{
	int n = 0;
	printf("Hello World\n");
	printf("%d\n", n + N);
	return 0;
}

1.預(yù)處理

查看 Test.c 預(yù)處理后的結(jié)果,-E選項的作用是讓 gcc 在預(yù)處理結(jié)束后停止編譯過程;-o 的作用是將預(yù)處理后的內(nèi)容保存到 test.i 文件中

gcc -E Test.c -o test.i

Linux的編譯器——gcc/g++(預(yù)處理、編譯、匯編、鏈接),linux,匯編,c++

如圖所示,預(yù)處理階段進行了頭文件包含、注釋的刪除、#define的替換等。

2.編譯

接下來將剛剛生成的 test.i 進行編譯,并在編譯之后停下來,將結(jié)果寫入 test.s 中。gcc所用選項為 -S。

gcc -S test.i -o test.s

Linux的編譯器——gcc/g++(預(yù)處理、編譯、匯編、鏈接),linux,匯編,c++

我們雖然可能沒學(xué)習(xí)過匯編語言,但依舊隱約認(rèn)識到這些就是匯編代碼;可見編譯階段就是將C代碼翻譯為匯編指令。

3.匯編

gcc所用選項為 -c-o 將結(jié)果寫入到test.o 中。

gcc -c test.s -o test.o

Linux的編譯器——gcc/g++(預(yù)處理、編譯、匯編、鏈接),linux,匯編,c++
正如我們所見,匯編完成之后都這這樣的亂碼。其實匯編之后,生成的文件為二進制文件,是用來給計算機看的,咱們已經(jīng)看不懂了。

4.鏈接

編譯完成之后就進入了鏈接階段,鏈接完成之后就會生成可執(zhí)程序 test了。

gcc test.o -o Test

Linux的編譯器——gcc/g++(預(yù)處理、編譯、匯編、鏈接),linux,匯編,c++

但是關(guān)于鏈接,我們需要知道它在鏈接什么。
比如為什么沒有定義過函數(shù) printf 、return …等,但卻可以使用它的功能?

其實,系統(tǒng)把這些函數(shù)的實現(xiàn)都被做到名為 libc.so.6 的庫文件中去了,在沒有特別指定時,gcc 會到系統(tǒng)默認(rèn)的搜索路徑
/usr/lib下進行查找,也就是鏈接到 libc.so.6 庫函數(shù)中去,這樣就能實現(xiàn)函數(shù) printf
了,而這也就是鏈接的作用。

三.動態(tài)庫與靜態(tài)庫

函數(shù)庫一般分為動、靜態(tài)庫兩種。二者的區(qū)別可以理解為私有與公共的區(qū)別。就好比我們需要讀一本《C和指針》,有兩種方法可以選。一種是自己買一本,只有自己可以用,用起來還挺方便,缺點就是得花錢;第二種是去圖書館借書,圖書館的資源被所有人共享。

gcc 進行函數(shù)庫的鏈接時可選擇靜態(tài)鏈接或者動態(tài)鏈接。

  1. 靜態(tài)鏈接就類似于自己買書看,只給自己看同時還費錢(浪費內(nèi)存),靜態(tài)鏈接時會將庫文件的代碼全部加入到可執(zhí)行文件中,因此生成的文件比較大。
  2. 動態(tài)鏈接類似于去圖書館借書。函數(shù)庫就放在某個固定的地方,哪個程序想去使用就去自己去加載它。

Linuxgcc默認(rèn)使用動態(tài)鏈接。

對比下二者生成的文件大小

//采用靜態(tài)鏈接
gcc -static Test.c -o Test_static
//默認(rèn)采用動態(tài)鏈接
gcc  Test.c -o Test

若在靜態(tài)鏈接時出錯,可能是因為你的Linux 沒有安裝C語言的靜態(tài)庫,須手動安裝。

//安裝C語言靜態(tài)庫
yum install -y glibc-static

Linux的編譯器——gcc/g++(預(yù)處理、編譯、匯編、鏈接),linux,匯編,c++

由此可見靜態(tài)鏈接比動態(tài)鏈接生成的可執(zhí)行文件大。

四.gcc常用選項

以下是gcc編譯器常用選項匯總

-E 只激活預(yù)處理,這個不生成文件,你需要把它重定向到一個輸出文件里面;
-S 編譯到匯編語言不進行匯編和鏈接;
-c 編譯到目標(biāo)代碼;
-o 文件輸出到 文件;
-static 此選項對生成的文件采用靜態(tài)鏈接;
-g 生成調(diào)試信息。GNU 調(diào)試器可利用該信息;
-shared 此選項將盡量使用動態(tài)庫,所以生成文件比較小,但是需要系統(tǒng)由動態(tài)庫.;
-O0
-O1
-O2
-O3 編譯器的優(yōu)化選項的4個級別,-O0表示沒有優(yōu)化,-O1為缺省值,-O3優(yōu)化級別最高;
-w 不生成任何警告信息;
-Wall 生成所有警告信息。


本文到此結(jié)束,碼文不易,還請多多支持哦!文章來源地址http://www.zghlxwxcb.cn/news/detail-541433.html

到了這里,關(guān)于Linux的編譯器——gcc/g++(預(yù)處理、編譯、匯編、鏈接)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Linux編譯器gcc/g++

    Linux編譯器gcc/g++

    以gcc編譯 以g++編譯,但是此時會發(fā)現(xiàn)沒有g(shù)++這個指令,所有需要安裝它,安裝指令 yum install gcc gcc-c++ gcc和g++都會形成可執(zhí)行文件a.out gcc只能編譯c語言代碼,g++能編譯c/c++ 以c程序為例,來看看它從一個文本類的c程序編譯成計算機可以認(rèn)識的二進制程序它需要經(jīng)過四個階段 預(yù)

    2024年02月10日
    瀏覽(26)
  • Linux——gcc/g++編譯器

    Linux——gcc/g++編譯器

    目錄 I.Linux編譯器 1.gcc/g++編譯器 在C代碼生成可執(zhí)行程序的過程中,會有四個過程: 1預(yù)處理,2編譯,3匯編,4鏈接 Linux對.c文件分辨進行預(yù)處理,編譯,匯編三大步指令: 預(yù)處理指令: 編譯指令: 匯編指令: 接下來說一說鏈接過程: II.動靜態(tài)鏈接? 一.動態(tài)鏈接 二.靜態(tài)鏈接

    2024年02月04日
    瀏覽(59)
  • Linux--編譯器-gcc/g++使用

    Linux--編譯器-gcc/g++使用

    目錄 前言 1.看一段樣例 ?2.程序的翻譯過程 1.第一個階段:預(yù)處理 2.第二個階段:編譯 3.第三個階段:匯編 4.第四個階段:鏈接 3.程序的編譯為什么是這個樣子? 4. 關(guān)于編譯器 5.鏈接(動靜態(tài)鏈接) 1.首先,我們來看一段樣例(見一下) 2.見完之后,我們來看一下程序的翻譯

    2024年02月20日
    瀏覽(29)
  • 【Linux】03 GCC編譯器的使用

    【Linux】03 GCC編譯器的使用

    ?在使用gcc編譯程序時,編譯過程可以簡要劃分為4個階段: ? ? ? ? 預(yù)處理、編譯、匯編、鏈接 這個階段主要處理源文件中的#indef、#include和#define預(yù)處理命令; 這里主要是把一些include的頭文件和一些宏定義,放到源文件中。 編譯命令: gcc? -E? -o? hello.i? hello.c 將經(jīng)過預(yù)處

    2024年01月20日
    瀏覽(31)
  • 【Linux】編譯器-gcc/g++使用

    【Linux】編譯器-gcc/g++使用

    個人主頁 : zxctscl 文章封面來自:藝術(shù)家–賢海林 如有轉(zhuǎn)載請先通知 在之前已經(jīng)分享了 【Linux】vim的使用,這次來看看在云服務(wù)器上的編譯器gcc。 我們先寫一段簡單的代碼: 當(dāng)我們進行編譯的時候: 發(fā)現(xiàn)根本就編譯不了。 這個是因為編譯器版本的問題: 查看編譯器的版

    2024年03月11日
    瀏覽(19)
  • Linux編譯器——gcc/g++使用

    Linux編譯器——gcc/g++使用

    前言: ?在上一篇,我們學(xué)習(xí)了關(guān)于文本編輯器 vim 的全部知識,今天給大家?guī)淼氖顷P(guān)于Linux編譯器—gcc/使用的詳細(xì)介紹。 本文目錄 ?(一)溫習(xí)程序的產(chǎn)生的過程 1、前言 2、程序的產(chǎn)生過程 3、??初步認(rèn)識 gcc?? a)?gcc的基本概念 b)gcc的基本特點 4、使用方法?? (二)

    2023年04月17日
    瀏覽(21)
  • Linux編譯器 gcc與g++

    Linux編譯器 gcc與g++

    程序的編譯過程: 1、 預(yù)處理 (頭文件包含、消除注釋、宏定義替換) 2、 編譯 (將語言替換成匯編代碼) 3、 匯編 (將匯編指令轉(zhuǎn)換為二進制指令) 4、 鏈接 (合并段表、符號表合并及重定位) 我們可以通過gcc工具實現(xiàn)程序的編譯過程: 2.1 預(yù)處理 預(yù)處理會完成:①頭

    2023年04月18日
    瀏覽(38)
  • [linux初階][vim-gcc-gdb] TwoCharter: gcc編譯器

    [linux初階][vim-gcc-gdb] TwoCharter: gcc編譯器

    目錄 一.Linux中g(shù)cc編譯器的下載與安裝 二.使用gcc編譯器來翻譯 C語言程序? ①.編寫C語言代碼 ②翻譯C語言代碼 a.預(yù)處理 b.編譯? c.匯編? d.鏈接 ③.執(zhí)行Main 二進制可執(zhí)行程序(.exe文件)? 三.總結(jié)? 使用yum命令(相當(dāng)于手機上的應(yīng)用市場)來進行安裝. ?下載完畢之后,使用 which gc

    2024年04月10日
    瀏覽(44)
  • Linux的學(xué)習(xí)之路:6、Linux編譯器-gcc/g++使用

    Linux的學(xué)習(xí)之路:6、Linux編譯器-gcc/g++使用

    本文主要是說一些gcc的使用,g++和gcc使用一樣就沒有特殊講述。 目錄 摘要 一、背景知識 二、gcc如何完成 1、預(yù)處理(進行宏替換) 2、編譯(生成匯編) 3、匯編(生成機器可識別代碼 4、鏈接(生成可執(zhí)行文件或庫文件) 5、函數(shù)庫 6、靜態(tài)庫和動態(tài)庫 7、gcc選項 三、思維導(dǎo)圖

    2024年04月23日
    瀏覽(33)
  • 如何在 Linux 上安裝 C 和 GCC 編譯器?

    如何在 Linux 上安裝 C 和 GCC 編譯器?

    Linux 是一組開源的類 UNIX 操作系統(tǒng),Ubuntu 是一種基于 Linux 的操作系統(tǒng),通常用于運行基于 Linux 的應(yīng)用程序。要在 Linux 上安裝 C 并在 Ubuntu 上構(gòu)建和運行 C 程序文件,我們需要安裝 GCC 編譯器。在 Ubuntu 存儲庫中,GCC 編譯器是我們需要安裝的 構(gòu)建基本 包的一部分。 我們知道

    2024年04月13日
    瀏覽(28)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包