目錄
1.yum
1.1 聯網
1.2 查看安裝包
1.3 安裝
1.4 卸載
2.vim
2.1vim的基本概念
2.2 vim的基本操作
2.3 vim正常模式(命令模式)命令集
2.4 vim末行模式命令集
2.5 簡單vim配置
3. sudo
4. gcc/g++
4.1背景知識
4.2 gcc/g++如何完成
gcc選項
1.yum
Linux下安裝軟件的方式有如下三種:
1.源代碼安裝 --- 較為繁瑣,需要注意代碼運行環境等問題
2.rpm安裝 --- Linux安裝包,需要注意文件缺失問題
3.yum安裝 --- 很好地解決了安裝源、安裝版本、安裝依賴問題
yum類似於手機中的應用商店,裏面內嵌了部分軟件的下載地址,通過聯網可以直接下載
- 安裝示例
1.1 聯網
關於 yum 的所有操作必須保證主機(虛擬機)網絡暢通
//可以通過 ping 指令驗證
ping www.baidu.com
1.2 查看安裝包
- 軟件包版本: 主版本號.次版本號.源程序發行號-軟件包的發行號.主機平台
- "x86_64" 後綴表示64位系統的安裝包, "i686" 後綴表示32位系統安裝包. 選擇包時要和系統匹配. "el7" 表示操作系統發行版的版本.
- "el7" 表示的是 centos7/redhat7. "el6" 表示 centos6/redhat6.
- base 表示的是 "軟件源" 的名稱, 類似於 "小米應用商店", "華為應用商店" 這樣的概念
1.3 安裝
yum install lrzsz//root
sudo yum install lrzsz//普通用户
yum 會自動找到都有哪些軟件包需要下載,
這時候敲 "y" 確認安裝. 出現 "complete" 字樣, 説明安裝完成
- 安裝軟件時由於需要向系統目錄中寫入內容, 一般需要 sudo 或者切到 root 賬户下才能完成.
- yum安裝軟件只能一個裝完了再裝另一個. 正在yum安裝一個軟件的過程中, 如果再嘗試用yum安裝另外 一個軟件, yum會報錯.
- 如果 yum 報錯, 請自行百度
1.4 卸載
yum remove lrzsz//root
sudo yum remove lrzsz//普通用户
就像應用商店中不能下載所有軟件一樣,沒有進行擴展的yum也不能下載所有軟件
yum install -y epel-release
該指令可以擴展安裝源!
感興趣的朋友可以安裝一下 fortune-mod、cowsay、sl 等好玩的軟件
yum工具的常用選項有:
install 表示安裝軟件包
list 列出所有可供安裝的軟件包
search 搜索包含指定關鍵字的軟件包
remove 卸載指定的軟件包
yum工具在每次安裝指定軟件包的時候,都會檢測源服務器上的軟件包信息,為了便捷不用每次都去搜索軟件包信息,因此使用 yum makecache將軟件包信息緩存到本地,使用 yum clean all 清理老舊的緩存信息。
yum -y update:升級所有包同時,也升級軟件和系統內核;
yum -y upgrade:只升級所有包,不升級軟件和系統內核,軟件和內核保持原樣。
2.vim
2.1vim的基本概念
vim是一種多模式的編輯器,目前學習3種:命令模式(Normal mode)、插入模式(Insert mode)和底行模式(last line mode)
各模式的功能區分如下:
- 正常/普通/命令模式(Normal mode) 控制屏幕光標的移動,字符、字或行的刪除,移動複製某區段及進入Insert mode下,或者到 last line mode
- 插入模式(Insert mode) 只有在Insert mode下,才可以做文字輸入,按「ESC」鍵可回到命令行模式。該模式是我們後面用的最頻繁 的編輯模式。
- 末行模式(last line mode) 文件保存或退出,也可以進行文件替換,找字符串,列出行號等操作。 在命令模式下,shift+: 即可進入該模式。要查看你的所有模式:打開vim,底行模式直接輸入 :help vim-modes
2.2 vim的基本操作
- 進入vim,在系統提示符號輸入vim及文件名稱後,就進入vim全屏幕編輯畫面
vim code.c//文件是之前已經創建好了的
- 模式間的切換
[正常模式]切換至[插入模式] 輸入a 輸入i 輸入o
[插入模式]切換至[正常模式] 目前處於[插入模式],就只能一直輸入文字,如果發現輸錯了字,想用光標鍵往回移動,將該字刪除,可 以先按一下「ESC」鍵轉到[正常模式]再刪除文字。當然,也可以直接刪除。
[正常模式]切換至[末行模式] 「shift + ;」, 其實就是輸入「:」
- 插入模式與底行模式間不能直接進行切換,需要通過命令模式進行切換
- 退出vim
在[正常模式]下,按一下「:」冒號鍵進入「Last line mode」
w (保存當前文件)
wq (輸入「wq」,存盤並退出vim)
q! (輸入q!,不存盤強制退出vim)
wq! (輸入「wq!」,強制存盤並退出vim):
2.3 vim正常模式(命令模式)命令集
插入模式
- 按「i」切換進入插入模式「insert mode」,按“i”進入插入模式後是從光標當前位置開始輸入文件;
- 按「a」進入插入模式後,是從目前光標所在位置的下一個位置開始輸入文字;
- 按「o」進入插入模式後,是插入新的一行,從行首開始輸入文字。
- # 是註釋符
從插入模式切換為命令模式 按「ESC」鍵。
移動光標
- vim可以直接用鍵盤上的光標來上下左右移動,但正規的vim是用小寫英文字母「h」、「j」、「k」、 「l」,分別控制光標左、下、上、右移一格
- 按「G」:移動到文章的最後
- 按「$」:移動到光標所在行的“行尾”
- 按「^」:移動到光標所在行的“行首”
- 按「w」:光標跳到下個字的開頭
- 按「e」:光標跳到下個字的字尾
- 按「b」:光標回到上個字的開頭
- 按「#l」:光標移到該行的第#個位置,如:5l,56l
- 按[gg]:進入到文本開始
- 按[shift+g]:進入文本末端
- 按「ctrl」+「b」:屏幕往“後”移動一頁
- 按「ctrl」+「f」:屏幕往“前”移動一頁
- 按「ctrl」+「u」:屏幕往“後”移動半頁
- 按「ctrl」+「d」:屏幕往“前”移動半頁
刪除文字
- 「x」:每按一次,刪除光標所在位置的一個字符
- 「#x」:例如,「6x」表示刪除光標所在位置的“後面(包含自己在內)”6個字符
- 「X」:大寫的X,每按一次,刪除光標所在位置的“前面”一個字符
- 「#X」:例如,「20X」表示刪除光標所在位置的“前面”20個字符
- 「dd」:刪除光標所在行
- 「#dd」:從光標所在行開始刪除#行
複製
- 「yw」:將光標所在之處到字尾的字符複製到緩衝區中。
- 「#yw」:複製#個字到緩衝區
- 「yy」:複製光標所在行到緩衝區。
- 「#yy」:例如,「6yy」表示拷貝從光標所在的該行“往下數”6行文字。
- 「p」:將緩衝區內的字符貼到光標所在位置。注意:所有與“y”有關的複製命令都必須與“p”配合才能完 成複製與粘貼功能。
替換
- 「r」:替換光標所在處的字符。
- 「R」:替換光標所到之處的字符,直到按下「ESC」鍵為止
撤銷上一次操作
- 「u」:如果您誤執行一個命令,可以馬上按下「u」,回到上一個操作。按多次“u”可以執行多次回 復。
- 「ctrl + r」: 撤銷的恢復
更改
- 「cw」:更改光標所在處的字到字尾處
- 「c#w」:例如,「c3w」表示更改3個字
跳至指定的行
- 「ctrl」+「g」列出光標所在行的行號。
- 「#G」:例如,「15G」,表示移動光標至文章的第15行行首。
2.4 vim末行模式命令集
在使用末行模式之前,請記住先按「ESC」鍵確定您已經處於正常模式,再按「:」冒號即可進入末行模式
列出行號
- 「set nu」: 輸入「set nu」後,會在文件中的每一行前面列出行號。
跳到文件中的某一行
- 「#」:「#」號表示一個數字,在冒號後輸入一個數字,再按回車鍵就會跳到該行了,如輸入數字15, 再回車,就會跳到文章的第15行。
多文件比較
- [vs + 文件名] 打開另一文件,不存在就自動創建,退出時不進行保存該文件就會被清理
- [ctrl + ww],切換光標所在文件的位置,光標在哪一個窗口,就對拿一個窗口進行操作
查找字符
- 「/關鍵字」: 先按「/」鍵,再輸入您想尋找的字符,如果第一次找的關鍵字不是您想要的,可以一直按 「n」會往後尋找到您要的關鍵字為止。
- 「?關鍵字」:先按「?」鍵,再輸入您想尋找的字符,如果第一次找的關鍵字不是您想要的,可以一直 按「n」會往前尋找到您要的關鍵字為止。
|
對比項目
|
/關鍵字
|
?關鍵字
|
|
搜索方向
|
從當前光標位置向文檔下方(後文方向)查找 |
從當前光標位置向文檔上方(前文方向)查找 |
|
後續按「n」的查找方向
|
繼續向文檔下方查找下一個匹配關鍵字
|
繼續向文檔上方查找下一個匹配關鍵字
|
|
適用場景
|
大致知道查找內容在文檔後半部分時更高效,如查找後文出現的特定函數示例
|
想查找之前出現過的內容時使用,如排查日誌中更早出現的相同錯誤信息
|
保存文件
- 「w」: 在冒號輸入字母「w」就可以將文件保存起來
離開vim
- 「q」:按「q」就是退出,如果無法離開vim,可以在「q」後跟一個「!」強制離開vim。 「wq」:一般建議離開時,搭配「w」一起使用,這樣在退出的時候還可以保存文件
- wq 保存並退出編輯,就算文件沒有修改也會寫入,並修改文件時間屬性
- q! 強制退出編輯,但並不保存當前修改
- x! 保存並退出編輯,僅當文件有修改時會寫入,並修改文件時間屬性
:s 表示substitute,也就是替換, 格式為以下
:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]
range 表示區間% 用於表示全文, 2,3 表示從第2行開始到第3行
{pattern} 表示字符串匹配規則,要匹配什麼樣的字符串 , 比如^a 表示以a字符起始的字符串
{string} 表示要將匹配到的字符串替換為的新的string字符串
[flags] s_flags中,g比較常用,通常使用g表示全部替換,默認如果不給的話,表示只替換一次
[count] 表示在一行中匹配多少次,很少會用到....
如果想要將文件中所有 nihao 替換為 hello 則命令為: %s/nihao/hello/g
:p 用於打印指定區間的行
:[range]p[rint] [flags]
:i 在指定行上方添加文本
:{range}i[nsert][!]
2.5 可視塊模式
Ctrl + V→J/K/H/L(移動選擇) →Shift + I→//→Esc,將選中行全部註釋
Ctrl + V→J/K/H/L(移動選擇) →x,將選中部分刪除
2.6 簡單vim配置
不對vim進行配置,那它插入方式與windows的文本編輯器基本一致,用來寫代碼肯定不舒服
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
上面這條命令可以堆vim進行簡單配置,建議一個用户一個配置,這樣不會互相影響
輸入自己的root密碼
使生效
3. sudo
普通用户在日常操作中權限有限,無法對系統關鍵文件和配置進行修改。
而通過
sudo,用户可以在需要時臨時獲得更高的權限來執行特定命令但是並不是所有普通用户都能進行sudo指令,必須將該用户添加到/etc/sudoers文件中才可
但是該文件只有root有權限更改,其他用户根本打不開
底行模式輸入 【wq!】強制保存退出
4. gcc/g++
4.1背景知識
我們知道C、C++等編譯型語言將源代碼通過
1. 預處理(進行宏替換)
2. 編譯(生成彙編)
3. 彙編(生成機器可識別代碼)
4. 連接(生成可執行文件或庫文件)
四個步驟最終形成可執行程序
4.2 gcc/g++如何完成
gcc是C語言的編譯器、g++是C++的編譯器,g++也可以編譯C語言
Linux下,gcc與g++的使用一致,下面以講解gcc為主
格式 gcc [選項] 要編譯的文件 [選項] [目標文件]
- 預處理(進行宏替換)
預處理功能主要包括宏定義,文件包含,條件編譯,去註釋等。
預處理指令是以#號開頭的代碼行。
gcc -E mycode.c -o mycode.i
選項“-E”,該選項的作用是讓 gcc 在預處理結束後停止編譯過程。
選項“-o”是指目標文件,“.i”文件為已經過預處理的C原始程序
該命令讓gcc處理mycode.c文件,預處理完成之後就停止,並形成mycode.i文件存儲預處理後的結果
至於條件編譯,雖然我不常用,但是有一個很貼近的現象就是,我們常用的vs,對於免費版與專業版,開發商用不着維護兩套代碼,通過條件編譯,即可切除部分功能
- 編譯
在這個階段中,gcc 首先要檢查代碼的規範性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查 無誤後,gcc 把代碼翻譯成彙編語言。
用户可以使用“-S”選項來進行查看,該選項只進行編譯而不進行彙編,生成彙編代碼。
gcc -S mycode.i -o mycode.s
該命令讓gcc處理mycode.i文件,編譯完成之後就停止,並形成mycode.s文件存儲編譯後的結果
- 彙編
彙編階段是把編譯階段生成的“.s”文件轉成目標文件
讀者在此可使用選項“-c”就可看到彙編代碼已轉化為“.o”的二進制目標代碼了
二進制目標文件不能夠獨立執行,需要通過連接才可以
gcc -c mycode.s -o mycode.o
該命令讓gcc處理mycode.s文件,彙編完成之後就停止,並形成mycode.o文件存儲彙編後的結果
機器語言屬實看不懂,打開也是亂碼
- 連接
在成功彙編之後,就進入了鏈接階段。
沒有選項,直接連接,形成可執行文件
本質上將二進制文件與庫進行連接形成可執行文件
總結:
ESC(鍵盤左上角)分別作為預處理、編譯、彙編的三個選項
iso(鏡像文件後綴)分別作為預處理後、編譯後、彙編後的文件名後綴
每次指令後如果不添加 -o 文件名 那麼預處理後、編譯後、彙編後的結果將直接顯示在屏幕上
- 函數庫
上面提到的連接過程就是二進制文件與庫之間的連接過程
二進制文件中儘管有頭文件代碼、自己的代碼,但是對於特定函數(如printf)的實現是缺失的,連接就起到調用實現的作用
連接分為動態鏈接與靜態連接兩種:
靜態連接連接的是靜態庫,靜態庫是指編譯鏈接時,把庫文件的代碼全部加入到可執行文件中,因此生成的文件比較大,但在運行時也 就不再需要庫文件了。靜態庫後綴名一般為“.a”
動態連接連接的是動態庫,動態庫與之相反,在編譯鏈接時並沒有把庫文件的代碼加入到可執行文件中,而是在程序執行時由運行時 鏈接文件加載庫,這樣可以節省系統的開銷。動態庫一般後綴名為“.so”
gcc 在編譯時默認使用動態庫。完成了鏈接之後,gcc 就可以生成可執行文件
添加 -static 選項,gcc 才會在編譯時使用靜態庫,進行靜態連接
|
指令
|
功能描述
|
常用選項
|
示例
|
|
|
|
用於打印程序或共享庫所依賴的共享庫(動態鏈接庫)。它可以幫助用户瞭解一個可執行文件或共享庫在運行時需要加載哪些動態鏈接庫。
|
通常無需複雜選項,直接接文件名。
|
|
|
|
|
用於檢測文件類型。它可以識別文件的類型,如文本文件、二進制文件、腳本文件等,並給出相應的描述信息。
|
|
|
機器默認安裝動態庫,不安裝靜態庫
sudo yum install -y glibc-static sudo yum install -y libstdc++-static
安裝C/C++靜態庫
沒有靜態庫,不能進行靜態連接
沒有動態庫,有靜態庫,而且gcc能找到,就能進行連接(靜態連接)
-static本質:改變編譯時的優先級,且只進行靜態鏈接
我們後續寫的程序,不一定是純的靜態或動態連接,多是混合連接
動 vs 靜
動態庫因為是共享庫,有效的節省資源(磁盤空間,內存空間,網絡空間等)[優] 動態庫一旦缺失,導致各個程序都無法運行[缺點]
靜態庫,不依賴庫,程序可以獨立運行[優點], 體積大,比較消耗資源[缺]
gcc選項
- -E 只激活預處理,這個不生成文件,你需要把它重定向到一個輸出文件裏面
- -S 編譯到彙編語言不進行彙編和鏈接
- -c 編譯到目標代碼
- -o 用於指定目標文件名稱
- -static 此選項對生成的文件採用靜態鏈接
- -g 生成調試信息。GNU 調試器可利用該信息。
- -shared 此選項將盡量使用動態庫,所以生成文件比較小,但是需要系統由動態庫.
- -O0 -O1 -O2 -O3
- 編譯器的優化選項的4個級別,-O0表示沒有優化,-O1為缺省值,-O3優化級別最高
- -w 不生成任何警告信息。
- -Wall 生成所有警告信息。