目錄
1. 軟件包管理器
1.1 什么是軟件包
1.2?Linux軟件生態
1.3 yum具體操作
1.3.1 查看軟件包
1.3.2 安裝軟件
1.3.3 卸載軟件
1.3.4 注意事項(測試網絡)
1.3.5 yum指令集總結
1.4?yum源目錄、安裝源
2. Vim編輯器的使用
2.1 Linux編輯器-vim使用
2.2 vim的基本概念
2.3 vim基本操作
2.3.1?模式切換
2.3.2?正常模式命令集
2.3.3 末行模式命令集
2.3.4 其他模式命令集(批量添加/刪除)
2.3.5 補充命令
3. 編譯器gcc/g++
3.1 gcc編譯
3.1.1?預處理(進行宏替換)
3.1.2?編譯(生成匯編)
3.1.3?匯編(生成機器可識別代碼)
3.1.4 鏈接(生成可執行文件或庫文件)
3.2 動態鏈接和靜態鏈接
3.3?靜態庫和動態庫
3.4 條件編譯用途,為什么C/C++編譯時要轉匯編
3.5?gcc其他常用選項(了解)
1. 軟件包管理器
1.1 什么是軟件包
? ? ? ? Linux安裝軟件的三種方式:
????????1. 下載到程序的源代碼, 并進行編譯, 得到可執行程序.
? ? ? ? 2. ".rpm"文件,一種軟件包格式,這種格式的文件擴展名通常是 .rpm。它包含了編譯好的軟件二進制文件、配置文件、文檔以及安裝/卸載腳本。(不包含軟件依賴)
? ? ? ?3. 包管理器(推薦),會分析軟件依賴關系,并自動從軟件倉庫下載并安裝所有必需的依賴包。
?????????Centos:?yum(Yellow dog Updater, Modified)是Linux下非常常用的一種包管理器. 主要應用在Fedora,RedHat, Centos等發行版上.
????????? Ubuntu:主要使用apt(Advanced Package Tool)作為其包管理器。apt同樣提供了自動解決依賴關系、下載和安裝軟件包的功能。
????????注意:安裝軟件需要root權限。
1.2?Linux軟件生態
1. Linux下載軟件的過程(Ubuntu、Centos、other)
2. 操作系統的好壞評估--- 生態問題
3.?為什么會有人免費特定社區提供軟件,還發布?還提供云服務器讓你下載?
驅動方 | 主要動機 | 獲得回報 |
個人開發者 | 理想主義、解決自身需求、獲得聲譽 | 名譽、技術提升、更好的就業機會 |
開源社區 | 協作精神、互利共贏 | 更好的軟件、強大的生態 |
商業公司 | 構建生態、降低行業成本、制定標準 | 銷售增值服務、支持服務、托管服務 |
云服務商 | 吸引用戶使用其高利潤的云平臺 | 豐厚的云服務收入(遠超帶寬成本) |
????????所以,這并非純粹的利他主義。這是一個精心設計的、多方共贏的生態系統:個人獲得名譽,企業獲得人才和創新,公司獲得利潤,社會獲得技術進步。 免費提供軟件和下載,只是這個龐大生態系統得以運轉的“入門成本”和“流量入口”。
4. 軟件包依賴的問題
5. 國內鏡像源
1.3 yum具體操作
1.3.1 查看軟件包
????????通過 yum list 命令可以羅列出當前一共有哪些軟件包. 由于包的數目可能非常之多, 這里我們需要使用grep 命令只篩選出我們關注的包. 例如:
# Centos,yum list加grep尋找lrzsz
yum list | grep lrzsz
# lrzsz.x86_64 0.12.20-36.el7 @base# 注意事項:
# 軟件包名稱: 主版本號.次版本號.源程序發行號-軟件包的發行號.主機平臺.cpu架構.
# "x86_64" 后綴表示64位系統的安裝包, "i686" 后綴表示32位系統安裝包. 選擇包時要和系統匹配.
# "el7" 表示操作系統發行版的版本. "el7" 表示的是 centos7/redhat7. "el6" 表示 centos6/redhat6.
# 最后一列, base 表示的是 "軟件源" 的名稱, 類似于 "小米應用商店", "華為應用商店" 這樣的概念.
1.3.2 安裝軟件
????????通過 yum, 我們可以通過很簡單的一條命令完成 lrzsz的安裝.
# Centos
# sudo yum install -y [軟件名]
$ sudo yum install -y lrzsz# Ubuntu
$ sudo apt install -y lrzsz# yum/apt 會自動找到都有哪些軟件包需要下載, 這時候敲 "y" 確認安裝.
# 出現 "complete" 字樣或者中間未出現報錯, 說明安裝完成.
# 注意事項:
# 安裝軟件時由于需要向系統目錄中寫入內容, 一般需要 sudo 或者切到 root 賬戶下才能完成.
# yum/apt安裝軟件只能一個裝完了再裝另一個. 正在yum/apt安裝一個軟件的過程中, 如果再嘗試用yum/apt安裝另外一個軟件, yum/apt會報錯.
1.3.3 卸載軟件
# Centos
sudo yum remove [-y] lrzsz# Ubuntu
sudo apt remove [-y] lrzsz
1.3.4 注意事項(測試網絡)
????????關于 yum / apt 的所有操作必須保證主機(虛擬機)網絡暢通!!!
????????可以通過 ping 指令驗證
ping www.baidu.com
1.3.5 yum指令集總結
指令 | 功能 |
yum install | 安裝軟件包 |
yum list | 列出所有可供安裝的軟件包 |
yum search | 搜索包含指定關鍵字的軟件包 |
yum remove | 寫在指定的軟件包 |
yum makecache | 將軟件包信息緩存到本地 |
yum search | 用于在搜索包含有指定關鍵字的軟件包 |
yum clean all | 清理老舊的緩存信息 |
yum update | 升級所有包同時,也升級軟件和系統內核 |
yum upgrade | 只升級所有包,不升級軟件和系統內核,軟件和內核保持原樣 |
1.4?yum源目錄、安裝源
????????Cetnos 安裝源路徑:
# /etc/yum.repos.d/ 目錄下存放的.reps文件就是是各種應用下載源
$ ll /etc/yum.repos.d/
total 16
-rw-r--r-- 1 root root 676 Oct 8 20:47 CentOS-Base.repo # 標準源
-rw-r--r-- 1 root root 230 Aug 27 10:31 epel.repo # 擴展源# 安裝擴展源,方便課堂演示
# $ sudo yum install -y epel-release
2. Vim編輯器的使用
2.1 Linux編輯器-vim使用
????????vi/vim的區別簡單點來說,它們都是多模式編輯器,不同的是vim是vi的升級版本,它不僅兼容vi的所有指令,而且還有一些新的特性在里面。例如語法加亮,可視化操作不僅可以在終端運行,也可以運行于x window、 mac os、 windows。我們課堂上,統一按照vim來進行講解。
2.2 vim的基本概念
????????vim三種基礎的模式分別是普通模式(Normal mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能區分如下:
????????? 正常/普通/命令模式(Normal mode)
????????控制屏幕光標的移動,字符、字或行的刪除,移動復制某區段及進入Insert mode下,或者到 lastline mode
????????? 插入模式(Insert mode)
????????只有在Insert mode下,才可以做文字輸入,按「ESC」鍵可回到命令行模式。該模式是我們后面用的最頻繁的編輯模式。
????????? 末行/底行模式(last line mode)
????????文件保存或退出,也可以進行文件替換,找字符串,列出行號等操作。
????????在命令模式下,*shift+:* 即可進入該模式。要查看你的所有模式:打開 vim,底行模式直接輸入:help vim-modes(應該一共有12種模式:six BASIC modes和six ADDITIONAL modes.)
2.3 vim基本操作
2.3.1?模式切換
功能 | 指令 |
進入vim(默認正常模式) | vim test.c |
正常模式→插入模式 | a 或 i 或 o |
插入模式→正常模式 | Esc |
正常模式→末行模式 | shift+; |
末行模式退出/保存文件指令 | |
保存 | w |
保存并退出 | wq |
不存強制退出 | q! |
2.3.2?正常模式命令集
功能 | 命令 | 具體功能 |
正常→插入模式 | i | 從光標當前位置開始輸入文件; |
a | 從目前光標所在位置的下一個位置開始輸入文字; | |
o | 插入新的一行,從行首開始輸入文字。 | |
移動光標 | h\j\k\l | 「h」「j」「k」「l」,分別控制光標左、下、上、右移一格。(光標移動可以帶數字#[n]) |
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”配合才能完成復制與粘貼功能。(可帶數字,粘貼n次) | |
替換模式 | r | 替換光標所在處的字符。 |
R | 替換光標所到之處的字符,直到按下「ESC」鍵為止。 | |
更改 | cw | 更改光標所在處的字到字尾處 |
c#w | 例如,「c3w」表示更改3個字 | |
查找 | shift+3=# | 選中單詞 |
n | 逆向查找,N正向查找 | |
?跳至指定的行 | Ctrl+g | 列出光標所在行的行號。 |
#G | 例如,「15G」,表示移動光標至文章的第15行首。(也可使以小寫模式的shift+g)?? | |
大小寫切換 | shift+~ | 大小寫切換 |
撤銷上一次操作 | u | 如果您誤執行一個命令,可以馬上按下「u」,回到上一個操作。按多次“u”可以執行多次回復。 |
Ctrl+r | 撤銷的恢復 |
2.3.3 末行模式命令集
功能 | 命令 | 具體功能 |
正常→末行模式 | Esc→: | 先Esc進入正常模式,shift+; 進入末行模式 |
列出行號 | set nu | 輸入「set nu」后,會在文件中的每一行前面列出行號。 |
取消行號 | set nonu | 取消行號 |
按行號跳轉 | # | 「#」號表示一個數字,在冒號后輸入一個數字,再按回車鍵就會跳到該行了,如輸入數字15,再回車,就會跳到文章的第15行。 |
查找 | /關鍵字 | 先按「/」鍵,再輸入您想尋找的字符,如果第一次找的關鍵字不是您想要的,可以一直按「n」會往后尋找到您要的關鍵字為止。 |
保存文件 | w | 在冒號后輸入字母「w」就可以將文件保存起來 |
離開vim(在wq、w、q后面跟!可以強制執行。) | q | 按「q」就是退出,如果無法離開vim,可以在「q」后跟一個「!」強制離開vim。 |
wq | 一般建議離開時,搭配「w」一起使用,這樣在退出的時候還可以保存文件。 | |
命令行模式 | ! | 在 ! 后面直接輸入命令,可以在vim中執行命令行操作。 |
批量替換 | %s/src/dst/g | 將src字串替換為dst;s是substitute的縮寫;%是指整個文件,不加%默認當前行;/g全局替換(一行內所有匹配項)不加 g 則只換每行的第一個 。 |
分屏操作 | vs new_src | 分屏給new_src |
Ctrl+ww | 切換分屏(正常模式下執行) |
2.3.4 其他模式命令集(批量添加/刪除)
1. 視圖模式(批量添加/刪除)
1. 正常模式→視圖模式 | Ctrl+v |
2. 移動光標,選中區域 | 同正常模式 |
3.1 批量添加 | |
視圖模式→(特殊)插入模式 | shift+i=I |
在光標所在行添加內容 | |
按下Esc鍵退出,則在光標選中的所有區域添加相同內容 | |
3.2 批量刪除 | |
按d刪除選中區域內容 |
2. 替換模式
替換模式 | r | 替換光標所在處的字符。 |
R | 替換光標所到之處的字符,直到按下「ESC」鍵為止。(也可用小寫的shift+r) |
2.3.5 補充命令
? ? ? ? 1. 打開時指定光標位置
# 打開文件并讓光標跳轉到15行
vim test.c +15
? ? ? ? 2.執行上一次帶#的操作
!v
#執行上一次vim test.c +15的操作,直接打開
3. 編譯器gcc/g++
????????編譯流程的四個步驟:
????????????????1. 預處理(進行宏替換/去注釋/條件編譯/頭文件展開等)
????????????????2. 編譯(生成匯編)
????????????????3. 匯編(生成機器可識別代碼)
????????????????4. 鏈接(生成可執行文件或庫文件)
3.1 gcc編譯
????????gcc編譯格式?
gcc [選項] 要編譯的文件 [選項] [目標文件]
? ? ? ? 單文件編譯
# 兩種格式都可以
gcc code.c -o codegcc -o code code.c
? ? ? ? 多文件編譯
gcc main.c code1.c code2.c -o code
# 將main.c code1.c code2.c編譯生成一個code文件# 兩種寫法都可以
gcc -o code main.c code1.c code2.c
3.1.1?預處理(進行宏替換)
????????預處理功能主要包括宏定義,文件包含,條件編譯,去注釋等。
????????預處理指令是以#號開頭的代碼行。
#實例:
gcc –E hello.c –o hello.i
# ?選項“-E”,該選項的作用是讓 gcc 在預處理結束后停止編譯過程。
# ?選項“-o”是指目標文件,“.i”文件為已經過預處理的C原始程序。
3.1.2?編譯(生成匯編)
????????? 在這個階段中,gcc 首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后,gcc 把代碼翻譯成匯編語言。
#實例:
gcc –S hello.i –o hello.s# 用戶可以使用“-S”選項來進行查看,該選項只進行編譯而不進行匯編,生成匯編代碼。
3.1.3?匯編(生成機器可識別代碼)
????????? 匯編階段是把編譯階段生成的“.s”文件轉成目標文件
# 實例:
gcc –c hello.s –o hello.o
# ?讀者在此可使用選項“-c”就可看到匯編代碼已轉化為“.o”的二進制目標代碼了# 補:不指定目標文件,會生成同名.o文件
gcc -c code.c
3.1.4 鏈接(生成可執行文件或庫文件)
# 實例
gcc hello.o –o hello
3.2 動態鏈接和靜態鏈接
? ? ? ? 簡單來講:靜態鏈接是將庫中實現好的方法拷貝到我們的程序中執行。動態鏈接是找到庫中方法的地址,跳轉到庫中執行方法,之后跳轉回來。靜態鏈接實際是拷貝,動態鏈接實際是尋址。
1. 靜態鏈接
????????實際開發中,程序由多個源文件(.c)組成,它們相互調用,存在依賴關系。每個 .c 文件都會獨立編譯成目標文件(.o),靜態鏈接負責把這些 .o 文件“打包”成一個完整的可執行程序。(注意:1.打包的是編譯好的二進制目標代碼.o文件;2.按需打包,只提取使用了的函數所在的目標文件;3.靜態庫只有在鏈接的時候有用,一旦形成可執行程序,靜態庫可以不再需要)
????????缺點:
? ? ? ? ? ? ? ? 1.?浪費空間:如果多個程序都用了同一個函數(如 printf),那么每個程序里都會有一份這個函數的完整代碼副本,導致磁盤和內存中存在多份重復內容。
????????????????2.?更新困難:一旦庫代碼有更新,所有依賴它的程序都必須重新編譯鏈接才能生效。
????????優點:
????????????????部署簡單,運行快:因為可執行程序自成一體,無需外部依賴,直接就能運行。
2. 動態鏈接
????????動態鏈接的出現解決了靜態鏈接中提到問題。動態鏈接的基本思想是把程序按照模塊拆分成各個相對獨立部分,在程序運行時才將它們鏈接在一起形成一個完整的程序,而不是像靜態鏈接一樣把所有程序模塊都打包,形成一個單獨的可執行文件。(動態鏈接在編譯階段向對應位置寫入需要執行的方法的地址,運行時根據地址跳轉到動態庫對應位置執行對應的方法)
????????動態鏈接其實遠比靜態鏈接要常用得多。比如我們查看下hello 這個可執行程序依賴的動態庫,會發現它就用到了一個c動態鏈接庫
$ ldd hellolinux-vdso.so.1 => (0x00007fffeb1ab000)libc.so.6 => /lib64/libc.so.6 (0x00007ff776af5000)/lib64/ld-linux-x86-64.so.2 (0x00007ff776ec3000)# ldd 用來查看程序或者庫文件所依賴的共享庫列表。
3. 動靜態鏈接對比:
? ? ? ? 1. 動態庫形成的可執行程序體積一定很小
? ? ? ? 2. 可執行程序對靜態庫的依賴度小,而動態庫不能缺失
? ? ? ? 3. 程序運行,需要加載到內存,靜態鏈接的,會在內存中出現大量的重復代碼
? ? ? ? 4. 動態鏈接,比較節省內存和磁盤資源。
4. 為什么要匯編生成.o文件
? ? ? ? 動靜態庫的本質是打包起來的.o文件。所以在整個編譯過程要進行匯編生成.o文件,然后使我的.o文件和動靜態庫中的.o文件鏈接生成可執行程序。
3.3?靜態庫和動態庫
? ? ? ? 庫是一套方法或者數據集,為我們開發提供最基本的保證(基本接口,功能,加速我們二次開發)
? ? ? ? 動靜態庫的本質是打包起來的.o文件。
????????? 靜態庫是指編譯鏈接時,把庫文件的代碼全部加入到可執行文件中,因此生成的文件比較大,但在運行時也就不再需要庫文件了。靜態庫后綴名一般為“.a”
????????? 動態庫與之相反,在編譯鏈接時并沒有把庫文件的代碼加入到可執行文件中,而是在程序執行時由運行時鏈接文件加載庫,這樣可以節省系統的開銷。動態庫一般后綴名為“.so”,如前面所述的libc.so.6 就是動態庫。gcc 在編譯時默認使用動態庫。完成了鏈接之后,gcc 就可以生成可執行文件,如下所示。gcc hello.o –o hello
????????? gcc默認生成的二進制程序,是動態鏈接的,這點可以通過file 命令驗證。
# file可以查看文件是動態鏈接還是靜態鏈接
$ file code
#code: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=e8625d13488f2780664671d6e3802e4c0e08abe3, not stripped
# dynamically linked (uses shared libs)
# 動態鏈接(使用共享庫)
????????補:一般我們的云服務器,C/C++的靜態庫并沒有安裝,可以采用如下方法安裝
# Centos
# 安裝C靜態庫
sudo yum install glibc-static# 安裝C++靜態庫
sudo yum install libstdc++-static
3.4 條件編譯用途,為什么C/C++編譯時要轉匯編
????????1. 條件編譯的用途
? ? ? ? ????????1. 軟件進行專業度,收費情況進行區分(業務),使用條件編譯,可以進行代碼動態裁剪
? ? ? ????????? 2. 內核源代碼也是采用條件編譯進行代碼裁剪
? ? ? ????????? 3. 開發工具,應用軟件。
? ? ? ? 2. 為什么C/C++編譯,要先變成匯編。
? ? ? ? ? ? ? ? 沒出現C之前:匯編語言 → 二進制
? ? ? ? ? ? ? ? 出現了C之后:C語言 → 匯編語言 → 二進制(復用之前匯編轉二進制,使得C只需要完成C轉匯編,實現更簡單)
3.5?gcc其他常用選項(了解)
選項 | 功能 |
-E | 只激活預處理,這個不生成文件,你需要把它重定向到一個輸出文件里面 |
-S | 編譯到匯編語言不進行匯編和鏈接 |
-c | 編譯到目標代碼 |
-o | 文件輸出到 文件 |
-static | 此選項對生成的文件采用靜態鏈接 |
-g | 生成調試信息。GNU 調試器可利用該信息。 |
-shared | 此選項將盡量使用動態庫,所以生成文件比較小,但是需要系統由動態庫. |
-O0、-O1、 -O2、-O3 | 編譯器的優化選項的4個級別,-O0表示沒有優化,-O1為缺省值,-O3優化級別最高 |
-w | 不生成任何警告信息。 |
-Wall | 生成所有警告信息。 |