目錄
一.軟件包管理器
一).軟件包
二).安裝軟件
三).刪除軟件
二.編輯器vim
?一).vim的基本介紹
1.正常/普通/命令模式(Normal mode)
2.插入模式(Insert mode)
3.底行模式(last line mode)
二).vim的基本操作
1.進入文本
2.切換模式?
3.退出文本?
三).?vim--正常模式--命令集
1.移動光標?
2.刪除文字
3.復制-粘貼
4.替換
5.?撤銷上?次操作
6.更改
7.跳至指定的行
四).vim--底行模式--命令集
1.列出行號
2.跳到文件中的某?行
3.查找字符
4.補充?
1).「: +? ! + 命令」
2).「: +?%s+ / 當前文本內容 / 新內容 /」
3).「: +? vs+ 文件名」
?五).簡單vim的配置
1.配置文件的位置
2.常用配置選項?
3.插件配置
三.編譯器gcc/g++
一).背景知識
二).gcc編譯選項
1.預處理(進行初步操作)
2.編譯(生成匯編)
3.匯編(生成機器可識別代碼)?
4.連接(生成可執行文件或庫文件)
5.補充?
三).動態鏈接和靜態鏈接
1.動態鏈接?
2.靜態鏈接?
四).靜態庫和動態庫
1.動靜態庫對比:
2.補充:
?四.自動化構建-make/Makefile
一).背景
二).理解
三).推導過程
?編輯
一.軟件包管理器
一).軟件包
- 在Linux下安裝軟件, ?個通常的辦法是下載到程序的源代碼, 并進行編譯, 得到可執行程序.
- 但是這樣太麻煩了, 于是有些人把?些常用的軟件提前編譯好, 做成軟件包(可以理解成windows上的安裝程序)放在?個服務器上, 通過包管理器可以很方便的獲取到這個編譯好的軟件包, 直接進行安裝.
- 軟件包和軟件包管理器, 就好比 "App" 和 "應用商店" 這樣的關系.
- yum(Yellow dog Updater, Modified)是Linux下非常常用的?種包管理器. 主要應用在Fedora,RedHat, Centos等發行版上.
- Ubuntu:主要使用apt(Advanced Package Tool)作為其包管理器。apt同樣提供了?動解決依賴關系、下載和安裝軟件包的功能?
二).安裝軟件
# Centos
$ sudo yum install sl# Ubuntu
$ sudo apt install sl虛擬機安裝拓展軟件源:?yum install -y epel-realse
注意事項:
- 安裝軟件時由于需要向系統目錄中寫入內容, ?般需要 sudo 或者切到 root 賬戶下才能完成.
- yum/apt安裝軟件只能?個裝完了再裝另?個. 正在yum/apt安裝?個軟件的過程中, 如果再嘗試用yum/apt安裝另外?個軟件, yum/apt會報錯.
- yum/apt 會?動找到都有哪些軟件包需要下載, 這時候敲 "y" 確認安裝.
- 出現 "complete" 字樣或者中間未出現報錯, 說明安裝完成.
三).刪除軟件
# Centos
sudo yum remove sl# Ubuntu
sudo apt remove sl
二.編輯器vim
?一).vim的基本介紹
講解vim的三種模式(其實有好多模式,目前掌握這3種即可),分別是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能區分如下。
1.正常/普通/命令模式(Normal mode)
控制屏幕光標的移動,字符、字或行的刪除,移動復制某區段及進入Insert mode下,或者到last line mode
2.插入模式(Insert mode)
只有在Insert mode下,才可以做文字輸入,按「ESC」鍵可回到命令行模式。該模式是我們后面用的最頻繁的編輯模式。
3.底行模式(last line mode)
文件保存或退出,也可以進行文件替換,找字符串,列出行號等操作。在命令模式下,*shift+:* 即可進入該模式。要查看你的所有模式:打開 vim,底行模式直接輸入?:help vim-modes
?
二).vim的基本操作
1.進入文本
進?vim,在系統提?符號輸?vim及?件名稱后,就進?vim全屏幕編輯畫?
2.切換模式?
進?vim之后,是處于[正常模式],你要切換到[插?模式]才能夠輸文字
[正常模式]切換?[插?模式]? ?按下「i」
[插?模式]切換?[正常模式]? ?處于[插?模式],就只能?直輸?文字,如果發現輸錯了字,想用光標鍵往回移動,將該字刪除,可以先按?下「ESC」鍵轉到[正常模式]再刪除文字。當然,也可以直接刪除。
[正常模式]切換?[末?模式]? ?「shift + :」, 其實就是輸?「:」
3.退出文本?
退出vim及保存文件,在[正常模式]下,按?下「:」冒號鍵進?「Last line mode」:
w (保存當前?件)
wq (輸?「wq」,存盤并退出vim)
?q! (輸?q!,不存盤強制退出vim)
shift + z + z(保存退出vim)
三).?vim--正常模式--命令集
1.移動光標?
1.按「i」
按「i」切換進入插入模式「insert mode」,按“i”進?插?模式后是從光標當前位置開始輸入?件;
2.按「a」
按「a」進?插入模式后,是從目前光標所在位置的下?個位置開始輸入文字;
3.按「o」
按「o」進?插入模式后,是插?新的?行,從行首開始輸入文字
4.按「shift + g」
移動到文章的最后
5.按「 shift + $(4) 」
移動到光標所在行的“行尾“
6.按「shift + ^(6)」
移動到光標所在行的“行首"
7.按[g + g]
進入到本文開始?
8.?按[shift+g]
進入文本末端
9.其他的命令?
按「w」:以單詞為單位,光標跳到下個字的開頭
按「e」:以單詞為單位,光標跳到下個字的字尾
按「b」:以單詞為單位,光標回到上個字的開頭
按「#l」:光標移到該行的第#個位置,如:5l,56l
按「ctrl」+「b」:屏幕往“后”移動一頁
按「ctrl」+「f」:屏幕往“前”移動一頁
按「ctrl」+「u」:屏幕往“后”移動半頁
按「ctrl」+「d」:屏幕往“前”移動半頁
2.刪除文字
1.按「x」
每按?次,刪除光標所在位置的?個字符
2.按「d + d」
剪切或刪除光標所在行
3.其他
「#x」:例如,「6x」表示刪除光標所在位置的“后面(包含自己在內)”6個字符
「X」:大寫的X,每按?次,刪除光標所在位置的“前面”?個字符
「#X」:例如,「20 + shift + x」表示刪除光標所在位置的“前面”20個字符
「#dd」:從光標所在行開始刪除#行
3.復制-粘貼
1.按「yy」
復制光標所在行到緩沖區。
2.其他?
「yw」:將光標所在之處到字尾的字符復制到緩沖區中。
「#yw」:復制#個字到緩沖區
「#yy」:例如,「6yy」表示拷貝從光標所在的該?“往下數”6行?字。
「p」:將緩沖區內的字符貼到光標所在位置。注意:所有與“y”有關的復制命令都必須與“p”配合才能完成復制與粘貼功能。
4.替換
1.按「r」
替換光標所在處的字符。
2.按「R」
替換光標所到之處的字符,直到按下「ESC」鍵為?
3「shift + ~ 」
大小寫切換
5.?撤銷上?次操作
一旦退出wq文件編輯,就無法再進行文件撤銷了。但只是保存w,沒有進行退出q,可以撤銷。?
1.「u」
如果您誤執行?個命令可以馬上按下「u」,回到上?個操作。按多次“u”可以執行多次復。
2.「ctrl + r」
撤銷的恢復
6.更改
1.「cw」
更改光標所在處的字到字尾處
2.「c#w」
例如,「c3w」表示更改3個字
7.跳至指定的行
1.「ctrl」+「g」
列出光標所在行的行號。
2.「#?+ shift + g」
「15 + shift + g」,表示移動光標至文章的第15行行?。
四).vim--底行模式--命令集
在使用末行模式之前,請記住先按「ESC」鍵確定您已經處于正常模式,再按「:」冒號即可進?末行模式。
1.列出行號
「set nu」: 輸?「set nu」后,會在文件中的每?行前面列出行號。
2.跳到文件中的某?行
「#」:「#」號表示?個數字,在冒號后輸入?個數字,再按回車鍵就會跳到該行了,如輸入數字15,再回車,就會跳到文章的第15行。
3.查找字符
- 「/關鍵字」: 先按「/」鍵,再輸入您想尋找的字符,如果第?次找的關鍵字不是您想要的,可以?直按「n」會往后尋找到您要的關鍵字為?。
- 「?關鍵字」:先按「?」鍵,再輸入您想尋找的字符,如果第?次找的關鍵字不是您想要的,可以?直按「n」會往前尋找到您要的關鍵字為?。
4.補充?
1).「: +? ! + 命令」
直接在vim中執行命令
2).「: +?%s+ / 當前文本內容 / 新內容 /」
批量化替換
3).「: +? vs+ 文件名」
分屏操作 (切換文件:Ctrl + w + w)
?五).簡單vim的配置
1.配置文件的位置
在目錄 /etc/ 下面,有個名為vimrc的文件,這是系統中公共的vim配置文件,對所有用戶都有效。
而在每個用戶的主目錄下,都可以自己建立私有的配置文件,命名為:“.vimrc”。例如,/root目錄下,通常已經存在?個.vimrc文件,如果不存在,則創建之。
切換用戶成為自己執行 su ,進入自己的主工作目錄,執行 cd ~
打開自己命令下的.vimrc文件,執行 vim .vimrc
2.常用配置選項?
" 開啟語法高亮
syntax on" 顯示行號
set number" 高亮當前行
set cursorline" 自動縮進
set autoindent" 設置 Tab 為 4 個空格
set tabstop=4
set shiftwidth=4
set expandtab" 搜索時忽略大小寫
set ignorecase" 智能大小寫(如果搜索內容有大寫則區分大小寫)
set smartcase" 啟用鼠標支持
set mouse=a
3.插件配置
可以看下面這位大佬的連接,非常詳細
https://gitee.com/mirrorvim/vim-fast
三.編譯器gcc/g++
一).背景知識
- 預處理(進行宏替換/去注釋/條件編譯/頭文件展開等)
- 編譯(生成匯編)
- 匯編(生成機器可識別代碼)
- 連接(生成可執行文件或庫文件)
二).gcc編譯選項
1.預處理(進行初步操作)
- 預處理功能主要包括宏定義,文件包含,條件編譯,去注釋等。
- 預處理指令是以#號開頭的代碼行。
實例: gcc –E hello.c –o hello.i
選項“-E”,該選項的作?是讓 gcc 在預處理結束后停止編譯過程。
選項“-o”是指目標?件,“.i”?件為已經過預處理的C原始程序。
2.編譯(生成匯編)
- 在這個階段中,gcc 首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后,gcc 把代碼翻譯成匯編語言。
- 用戶可以使用“-S”選項來進行查看,該選項只進行編譯而不進行匯編,生成匯編代碼。
實例: gcc –S hello.i –o hello.s
3.匯編(生成機器可識別代碼)?
- 匯編階段是把編譯階段?成的“.s”文件轉成目標文件
- 讀者在此可使用選項“-c”就可看到匯編代碼已轉化為“.o”的二進制目標代碼了
實例: gcc –c hello.s –o hello.o
4.連接(生成可執行文件或庫文件)
- 在成功編譯之后,就進入了鏈接階段。
實例: gcc hello.o –o hello
5.補充?
- E -S -c? ?形成 .i .s .o文件
我們一般先將源文件編譯成 .o文件,再將所有的.o文件連接成可執行程序
三).動態鏈接和靜態鏈接
1.動態鏈接?
動態鏈接的基本思想是把程序按照模塊拆分成各個相對獨立部分,在程序運?時才將它們鏈接在?起形成?個完整的程序,而不是像靜態鏈接?樣把所有程序模塊都鏈接成?個單獨的可執行文件
舉個簡單的例子吧?
2.靜態鏈接?
在我們的實際開發中,不可能將所有代碼放在?個源文件中,所以會出現多個源文件,而且多個源文件之間不是獨立的,而會存在多種依賴關系,如?個源文件可能要調用另?個源文件中定義的函數,但是每個源?件都是獨立編譯的,即每個*.c文件會形成?個*.o文件,為了滿足前面說的依賴關系,則需要將這些源文件產生的目標文件進行鏈接,從而形成?個可以執行的程序。這個鏈接的過程就是靜態鏈接?
?
四).靜態庫和動態庫
- 靜態庫(只在鏈接時有用)是指編譯鏈接時,把庫文件的代碼全部加入到可執行文件中,因此生成的文件比較大,但在運行時也就不再需要庫文件了。其后綴名?般為“.a”
- 動態庫與之相反,在編譯鏈接時并沒有把庫文件的代碼加?到可執行文件中,而是在程序執行時由運行時鏈接文件加載庫,這樣可以節省系統的開銷。動態庫?般后綴名為“.so”,如前面所述的libc.so.6 就是動態庫。gcc 在編譯時默認使用動態庫。完成了鏈接之后,gcc 就可以生成可執行文件,如下所示。 gcc hello.o –o hello
- gcc默認生成的二進制程序,是動態鏈接的,這點可以通過 file 命令驗證
強制使用靜態庫生成:
Linux下,動態庫XXX.so, 靜態庫XXX.a
Windows下,動態庫XXX.dll, 靜態庫XXX.lib
庫的名稱:
1.動靜態庫對比:
- 動態庫形成的可執行程序體積一定很小
- 可執行程序對靜態庫的依賴度小,動態庫不能缺失
- 程序運行,需要加載到內存,靜態鏈接的,會在內存中出現大量的重復代碼,
- 動態鏈接,比較節省內存和磁盤資源
2.補充:
使用C++?
?初步認識庫
?四.自動化構建-make/Makefile
一).背景
- 會不會寫makefile,從?個側面說明了?個人是否具備完成大型工程的能力。
- ?個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了?系列的規則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復雜的功能操作
- ?makefile帶來的好處就是?“自動化編譯”,?旦寫好,只需要?個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。
- make是?個命令工具,是?個解釋makefile中指令的命令工具,?般來說,大多數的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可見,makefile都成為了?種在工程方面的編譯方法。
- make是?條命令,makefile是一個文件,兩個搭配使用,完成項目自動化構建
二).理解
makefile的基本概念---------依賴關系,依賴方法?
依賴關系
上面的文件code,它依賴code.c
依賴方法
gcc -o code code.c ,就是與之對應的依賴關系
1.默認老代碼不做重新編譯
2.那么make怎么知道可執行程序和源文件的新舊問題?
操作:stat - 文件名
Modify:內容變更,時間更新
Chang:屬性變更,時間更新
Access:常指的是文件
最近?次被訪問的時間。在Linux的早期版本中,每當文件被訪問時,其atime都會更新。但這種機制會導致大量的IO操作(多次查看才會改變)
通過對比源文件和可執行文件的Modify時間
?項目清理
- 工程是需要被清理的
- 像clean這種,沒有被第?個目標文件直接或間接關聯,那么它后?所定義的命令將不會被自動執行,不過,我們可以顯示要make執行。即命令?“make clean”,以此來清除所有的目標文件,以便重編譯
- 但是?般我們這種clean的目標文件,我們將它設置為偽目標,? .PHONY 修飾,偽?標的特性是,總是被執行的
PHONY:讓make忽略源文件和可執行目標文件的M時間對比
三).推導過程
code:code.ogcc code.o -o code code.o:code.sgcc -c code.s -o code.o code.s:code.igcc -S code.i -o code.s code.i:code.cgcc -E code.c -o code.i .PHONY:clean clean:rm -f *.i *.s *.o code
當然一般沒有人會像上面這么寫?
make是如何工作的,在默認的方式下,也就是我們只輸入make命令。
1. make會在當前目錄下找名字叫“Makefile”或“makefile”的文件。
2. 如果找到,它會找文件中的第?個目標文件(target),在上面的例子中,他會找到 code這個文件,并把這個文件作為最終的目標文件。
3. 如果 code文件不存在,或是 myproc 所依賴的后面的 myproc.o 文件的文件修改時間要比code這個文件新(可以用?touch 測試),那么,他就會執行后面所定義的命令來生成code這個文件。
4. 如果 code所依賴的 code.o 文件不存在,那么 make 會在當前文件中找目標為code.o 文件的依賴性,如果找到則再根據那?個規則生成?code.o 文件。(這有點像?個堆棧的過程)
5.當然,你的C文件和H文件是存在的啦,于是 make 會生成 code.o ?件,然后再用 code.o文件聲明 make 的終極任務,也就是執行文件 hello 了。
6. 這就是整個make的依賴性,make會?層??層地去找文件的依賴關系,直到最終編譯出第?個?標?件。
7. 在找尋的過程中,如果出現錯誤,比如最后被依賴的文件找不到,那么make就會直接退出,并報錯,而對于所定義的命令的錯誤,或是編譯不成功,make根本不理
?8. make只管文件的依賴性,即,如果在我找了依賴關系之后,冒號后面的文件還是不在,那么對不起,我就不工作啦。
?面對多個文件,我們習慣把源文件先編譯.o文件,再進行鏈接
BIN=proc.exe #定義變量 CC=gcc #SRC=$(shell ls *.c) #采用shell命令?方式,獲取當前所有.c?件名 SRC=$(wildcard *.c) #或者使? wildcard 函數,獲取當前所有.c?件名 OBJ=$(SRC:.c=.o) #將SRC的所有同名.c 替換 成為.o 形成?標?件列表 LFLAGS=-o #鏈接選項 FLAGS=-c #編譯選項 RM=rm -f #引?命令$(BIN):$(OBJ)@$(CC) $(LFLAGS) $@ $^ #$@:代表?標?件名。 $^: 代表依賴?件列表@echo "linking ... $^ to $@" %.o:%.c #%.c 展開當前?錄下所有的.c。 %.o: 同時展開同名.o@$(CC) $(FLAGS) $< #%<: 對展開的依賴.c?件,?個?個的交給gcc。@echo "compling ... $< to $@" #@:不回顯命令.PHONY:clean clean:$(RM) $(OBJ) $(BIN) # $(RM).PHONY:test test:@echo $(SRC)@echo $(OBJ)