Linux C學習day2
Linux下C語言開發環境
- 編輯器Vi
1.什麼是Vi
- Vi是Linux系統中一種文字編輯器,它的使用方法和介面與Unix平臺十分相似。掌握了vi的命令,你可以感覺到它強大的功能與高效
- vi相對來說比較小,無論你使用任何Linux系統,你總是可以使用vi的。在很多系統中,可能只有vi供你選擇
- vim 是vi的高階版本,相容vi,功能更強大
2.基本操作
(1)進入vim:
在系統提示字元下鍵入: vim <檔名稱>
vim可以自動幫你載入所要編輯的檔案或是開啟一個新檔案。進入
(2)離開vim:
可以在指令模式下鍵入
:q 退出vim
:q! 不儲存強制退出vim
:wq 儲存後再離開
:x 儲存後再離開
(3)在插入模式和底行模式下用[Esc]鍵切換到命令列模式。
u
3.Vi的三種模式
(1)命令列模式
即進入時預設的模式:
控制螢幕游標的移動,字元、字或行的刪除,移動複製某區段及進入輸入模式
(2)底行模式
開始編輯命令
i 在游標前輸入文字
I 在當前行開始輸入文字
a 在游標後輸入文字
A 在當前行末尾輸入文字
o 在當前行後輸入新一行
O 在當前行前輸入新一行
游標移動命令
b 移動到當前單詞的開始
e 移動到當前單詞的結尾
w 向後移動一個單詞
h 向前移動一個字元 ←
j 向下移動一行 ↓
k 向上移動一行 ↑
l 向後移動一個字元 →
刪除命令
x 刪除游標所在的字元
dw 刪除游標所在的單詞
d$ 刪除游標至行尾所有字元
D 同 <d$>
dd 刪除當前行
ndd 刪除當前行以後的n行
改變與替換操作命令
r 替換游標所在的字元
R 替換字元序列
cw 替換一個單詞
ce 同cw
c$ 替換自游標位置至行尾的所有字元
C 同c$
cc 替換當前行
拷貝和貼上 命令
yw 將游標所在單詞複製到貼上板
y$ 將游標至行尾的字元複製到貼上板
Y 同y$
yy 將當前行復制到貼上板
nyy 將當前行後的n行復制到貼上板
P 將貼上板中的內容貼上在游標前
p 將貼上板中的內容貼上在游標後
其他有用命令
nG 跳到第n行
u 撤銷
. 重做
配對括號的查詢:
用法:將游標移動到一個括號上,按下%,游標跳轉到其配對的括號上
{}、()
頁面操作:
ctrl + b #向前移動一頁
ctrl + f #向後移動一頁
zz #將當前行置於螢幕中央
gg #移動到第一行行首
G #移動到最後一行行首
數字 + 命令:
nG #跳到第n行
nx #刪除n個字元
ndd #刪除當前行以後的n行
nyy #將當前行後的n行復制到貼上板
n+ #向後跳轉n行
n- #向前跳轉n行
n↑↓←→ #向上下左右跳轉n次
(3)插入模式
以":"或者"/"為前導的指令,出現在螢幕的最下一行,任何輸入都被當成特別指令。
- 編譯器gcc
1.什麼是gcc?
gcc(GNU CCompiler)是GNU才推出的功能強大、效能優越的多平臺編譯器,gcc編譯器能將c、c++語言源程式編譯、連結成可執行檔案,以下是gcc支援編譯的一些原始檔的字尾及其解釋
.c為字尾的檔案,c語言原始碼檔案;
.h為字尾的檔案,是程式包含的標頭檔案;
.i為字尾的檔案,是已經預處理過的c原始碼檔案;
.s為字尾的檔案,是組合語言原始碼檔案
.o為字尾的檔案,是編譯後的目標二進位制檔案;
2.編譯過程
- 預處理
前處理器(cpp)根據以字元#開頭的命令,修改原始c程式。比如hello.c中的第一行的#include <stdio.h>指令告訴前處理器讀取系統檔案stdio.h的內容。並把它直接插入到程式文字中去。結果就得到了另一個C程式,通常是以 “.i”作為副檔名。
gcc -E hello.c -o hello.i
- 編譯
編譯器(ccl)將文字檔案 hello.i 翻譯成文字檔案 hello.s ,它包含一個組合語言程式。組合語言程式中的每條語句都以一種標準的文字格式確切地描述了一條低階機器語言指令。組合語言是非常有用的,因為它為不同高階語言的不同編譯器提供了通用輸出語言。例如:c語言編譯器和Fortran編譯器產生的輸出檔案用的都是一樣的組合語言。
gcc -S hello.i -o hello.s
- 彙編
接下來,彙編器(as)將hello.s翻譯成機器語言指令,把這些指令打包成為一種叫做可重定位目標程式的格式,並將結果儲存在目標檔案hello.o中。hello.o檔案是一個二進位制檔案,它的位元組編碼是機器語言指令而不是字元,如果我們在文字編輯器中開啟hello.o檔案,呈現的將是一堆亂碼。
gcc -c hello.s -o hello.o
- 連結
請注意,我們的hello程式呼叫了printf函式,它是標準c庫中的一個函式,每個C編譯器都提供,printf函式存在與一個名為printf.o的單獨的預編譯目標檔案中,而這個檔案必須以某種方式併入到我們的hello.o程式中。連結器(ld)就負責這種併入,結果就得到hello檔案,它是一個可執行目標檔案(或者簡稱為可執行檔案)。可執行檔案載入到儲存器後,由系統負責執行。
gcc hello.o -o hello
3.其他注意事項
(1)gcc example.c -o example #直接生成可執行檔案
(2)./example #執行可執行檔案
(3)若不使用 -o 則生成可執行檔案 a.out
(4)Linux標頭檔案預設放在/usr/include中
- 偵錯程式Gdb
1.Gdb使用流程
例: 輸出1-100之間的素數
// func.c
在儲存退出後首先使用 Gcc 對 test.c 進行編譯,注意一定要加上選項“-g” ,這樣編譯出的可執行程式碼中才包含除錯資訊,否則之後 Gdb 無法載入該可執行檔案。
gcc -g func.c -o test
雖然這段程式沒有錯誤,但除錯完全正確的程式可以更加了解 Gdb 的使用流程。接下來就啟動 Gdb 進行除錯。注意,Gdb 進行除錯的是可執行檔案,而不是如“.c”的原始碼,因此,需要先通過 Gcc 編譯生成可執行檔案才能用 Gdb 進行除錯。
2.常用命令
1、 l(list) #一次列出10行程式碼(list n,m #列出n~m行)
2、 r(run) #執行程式(未設定斷點,將程式執行完畢)
3、 b(break) #b+行號,在該行設定斷點
4、 c(continue) #當程式執行時,繼續執行程式,直到遇到斷點
5、 i b(info break) #檢視斷點資訊
6、 d+編號 #(delete)刪除該斷點(d刪除所有斷點)
7、 clear+行號 #刪除指定行斷點(不加行報錯)
8、 p(print) #p+變數名,顯示變數的值
9、 s(step) #單步執行(進入呼叫函式)
10、 n(next) #不進入呼叫的函式,只在主函式中執行
11、 return/finish #退出step進入的呼叫函式
12、 q(quit) #退出gdb除錯
- Makefile
1.為什麼使用make?
所謂工程管理器,顧名思義,是指管理較多的檔案的。試想一下,有一個上百個檔案的程式碼構成的專案,如果其中只有一個或少數幾個檔案進行了修改,按照之前所學的Gcc 編譯工具,就(第一個缺點)不得不把這所有的檔案重新編譯一遍,因為編譯器並不知道哪些檔案是最近更新的,而只知道需要包含這些檔案才能把原始碼編譯成可執行檔案,於是,(第二個缺點)程式設計師就不能不再重新輸入數目如此龐大的檔名以完成最後的編譯工作。
但是,請仔細回想一下程式編譯過程,編譯過程是分為編譯、彙編、連結不同階段的,其中編譯階段僅檢查語法錯誤以及函式與變數的宣告是否正確聲明瞭,在連結階段則主要完成是函式和全域性變數的連結。因此,那些沒有改動的原始碼根本不需要重新編譯,而只要把它們重新連結進去就可以了。所以,人們就希望有一個工程管理器能夠自動識別更新了的檔案程式碼,同時又不需要重複輸入冗長的命令列,這樣,Make工程管理器也就應運而生了。
實際上,Make 工程管理器也就是個“自動編譯管理器” ,這裡的“自動”是指它能夠根據檔案時間戳自動發現更新過的檔案而減少編譯的工作量,同時,它通過讀入 Makefile 檔案的內容來執行大量的編譯工作。使用者只需編寫一次簡單的編譯語句就可以了。它大大提高了實際專案的工作效率,而且幾乎所有 Linux 下的專案程式設計均會涉及它,希望認真學習本節內容。
makefile 是 make 讀入的唯一配置檔案,因此本節的內容實際就是講述 Makefile 的編寫規則。
1、makefile的基本格式:target:dependency
(Tab字元)command
注:若dependencyt比target日期新或target不存在,則make會執行command
2、makefile中變數的使用
OBJECTS = sum.o sub.o operator.o #定義變數
$(OBJECTS) #使用變數
3、makefile的自動推導(隱晦規則)
GNU的make很強大,它可以自動推導檔案以及檔案依賴關係後面的命令,於是我們就沒必要去在每一個[.o]檔案後都寫上類似的命令,因為,我們的make會自動識別,並自己推導命令。只要make看到一個[.o]檔案,它就會自動的把[.c]檔案加在依賴關係中。如:如果make找到一個main.o,那麼main.c就會是main.o的依賴檔案。並且gcc -c main.c -o main.o也會被推匯出來。
- shell