Linux中的yum和gcc/g++

一、快速了解yum(簡要介紹)

linux操作系統中,我們需要進行工具/命令/程序的安裝、檢查和卸載等操作,這時需要用到yum。

在Linux中安裝軟件的方式有:源代碼安裝、交叉編譯、直接安裝rpm包,以及使用yum或apt-get。yum是Linux系統預裝的一個命令,用于搜索、下載和安裝相應的軟件包,就如同手機上的應用商店一樣,是由廠商內置的。

總之,yum相當于Linux的應用商店!

二、快速使用yum(三大基本命令)

  • 搜索軟件包:yum list | grep command
  • 安裝軟件包:yum install [-y] command(這里的-y可以選擇是否添加)
  • 卸載軟件包:yum remove command

請注意,后兩條命令需要root權限執行,或者使用sudo前綴。


三、Linux編輯器-vim的使用

vi和vim的區別簡單來說,它們都是多模式編輯器,vim是vi的升級版本,不僅兼容vi的所有指令,還增加了新的特性,如語法高亮、可視化操作等。vim不僅可以在終端運行,還能在X Window、Mac OS和windows上運行。

1、vim的基本概念

我們目前只需要掌握vim的三種模式:命令模式、插入模式和底行模式。

  • 命令/正常/普通模式:控制屏幕光標的移動,刪除字符、單詞或行。(vim打開時的默認模式)
  • 插入模式:只有在插入模式下才能進行文字輸入,這是我們最常用的編輯模式。
  • 底行模式:用于文件保存或退出,也可以進行文件替換、查找字符串、列出行號等操作。

Linux中的yum和gcc/g++

要回到命令模式,只需按Esc鍵。

  • 從命令模式轉到插入模式:輸入 o / i / a
  • 從命令模式轉到底行模式:輸入 Shift+;

2、常用模式介紹——命令模式和底行模式

命令模式:

Linux中的yum和gcc/g++

底行模式:

  • 保存文件:在冒號后輸入字母「w」即可保存文件。

  • 退出vim:按「q」退出,如果無法退出,可以在「q」后加「!」強制退出。

  • 保存并退出:使用「wq」組合命令,在退出時同時保存文件。

  • 執行命令:在不退出vim的情況下,輸入「!command」執行操作。

  • 文件替換:使用「vs filename」命令,光標所在的界面即為當前編輯的界面,底行模式同樣適用。

  • 多終端切換:使用「CTRL + ww」進行光標在多個終端間的切換。

  • 保存并退出:使用「shift zz」或「ZZ」命令。

批量注釋:

  • 使用「ctrl v」選擇區域,然后按「shift + i」輸入「//」,最后按Esc鍵完成批量注釋。
  • 批量去注釋:使用「CTRL v」選擇區域,然后按「d」鍵刪除注釋。

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

c語言建議使用gcc編譯,當然也可以使用g++;但c++語言只能使用g++編譯器。

一、程序的翻譯過程

1、預處理(進行宏替換)

預處理功能主要包括宏定義、文件包含、條件編譯、去注釋等。預處理指令是以#號開頭的代碼行。

頭文件展開的本質是在預處理時,將頭文件內容拷貝至源文件中。

實例:gcc –E hello.c –o hello.i

選項“-E”讓gcc在預處理結束后停止編譯過程。選項“-o”指定目標文件,“.i”文件是經過預處理的C原始程序。

2、編譯(生成匯編)

在這個階段,gcc首先檢查代碼的規范性和語法錯誤,確定代碼的實際工作內容,檢查無誤后,將代碼翻譯成匯編語言。

用戶可以使用“-S”選項查看,僅進行編譯而不進行匯編,生成匯編代碼。

實例:gcc –S hello.i –o hello.s

擴展:條件編譯的用途

1:動態裁剪

Linux中的yum和gcc/g++

通過給編譯器傳遞不同的宏值,可以對代碼進行動態裁剪。例如,一個程序有商業版和普通版,商業版有更多功能。我們不需要兩份代碼進行調試,只需通過傳遞不同的宏值在一份代碼中實現動態裁剪。

2:防止頭文件被重復包含

Linux中的yum和gcc/g++

通過條件編譯檢查頭文件是否重復包含,如果沒有包含,則執行下面的代碼;如果已經包含,則不執行下面的代碼。

3、匯編(生成機器可識別代碼)

匯編階段將編譯階段生成的“.s”文件轉成目標文件。

讀者可以使用選項“-c”查看匯編代碼已轉化為“.o”的二進制目標代碼。

實例:gcc –c hello.s –o hello.o

4、鏈接

在成功編譯之后,進入鏈接階段。

實例:gcc hello.o –o hello

函數庫:

問題:我們的C程序中并沒有定義“printf”函數的實現,且在預編譯中包含的“stdio.h”中也只有該函數的聲明,而沒有定義函數的實現,那么“printf”函數的實現是在哪里?

答:系統將這些函數的實現放在了名為libc.so.6的庫文件中。在沒有特別指定時,gcc會在系統默認的搜索路徑“/usr/lib”下查找,也就是鏈接到libc.so.6庫函數中,從而實現“printf”函數。這就是鏈接的作用。

動態庫和靜態庫的比較:

動態庫(動態鏈接):

優點:節省資源,不會出現太多的重復代碼。 缺點:對庫的依賴性較強,一旦庫丟失,所有使用這個庫的程序都無法運行。

靜態庫(靜態鏈接):

優點:不依賴庫,同類型平臺中都可以直接運行使用。 缺點:可執行程序體積較大,浪費資源(如磁盤、內存、網絡等)。

TIP:

Linux中的yum和gcc/g++

當gcc編譯時,系統默認使用動態鏈接!


擴展:語言和編譯器的自舉過程

問:是先有語言,還是先有編譯器?

答案是先有語言。

比如,先創造了C語言,然后用低級語言(匯編代碼)編寫一個能編譯C語言的編譯器,這樣我們就可以編寫軟件了,接著用這個編譯器編寫一個用C語言編寫的編譯器。

上述過程就是語言和編譯器的自舉過程。

二、gcc選項

  • -E:只激活預處理,不生成文件,需要重定向到輸出文件。
  • -S:編譯到匯編語言,但不進行匯編和鏈接。
  • -c:編譯到目標代碼。
  • -o 文件:輸出到指定文件。
  • -Static:對生成的文件采用靜態鏈接。
  • -g:生成調試信息,gnu調試器可利用該信息。

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享