序 我們都知道,一個可執行程式的基本的生命過程是如此的: (編輯)源文件 >(編譯)目標文件 >(鏈接)可執行文件 >(調試排錯)穩定執行 所以,在這個過程中,我們很容易看得出。一個程式開發過程是離不開,編輯器,編譯器,調試器這三個工具的。 那麼vim,gcc(g++),gdb就是linux環境C/ ...
序
我們都知道,一個可執行程式的基本的生命過程是如此的:
(編輯)源文件--->(編譯)目標文件--->(鏈接)可執行文件--->(調試排錯)穩定執行
所以,在這個過程中,我們很容易看得出。一個程式開發過程是離不開,編輯器,編譯器,調試器這三個工具的。
那麼vim,gcc(g++),gdb就是linux環境C/C++編程三把尖刀,沒有他們的存在,江湖總是太過平靜了。
修習之劍vim
vim模式:
基本分類
①插入模式(可編輯,輸入字元狀態),②命令模式(底行模式),③視圖模式(v進入,可選定字元)
詳細分化
1.通常模式(n) 在其它任何一個模式下,用ESC或者 ctrl+c 鍵可以退到通常模式
2.插入模式(i) 在這個模式下,vim像一個常見的編輯器.在通常模式下,用i或者a可以進行本模式,當然,還有一些其它命令也可以.
3.可視模式(v) 在這個模式下,可以使用hjkl進行選擇.然後進行copy,paste或者其它操作. 在通常模式下,用v命令進行可視模式.
4.塊操作模式(V) 這是塊操作模式. 在通常模式下,用ctrl+v進入本模式.
5.修改模式(R) 這是改寫的模式.很多軟體法用insert鍵來完成這個切換.在vim中,從通常模式用R即可進入改寫模式.
6.擴展命令模式(ex) 這是命令執行模式 在通常模式下用:切換到此模式
模式切換:
模式下操作
普通模式下:
跳轉
到行末 $
到行首 ^
到文件開始 gg
到文件最後 G
到第n行 nG
---以字元/行為單位跳轉
游標移動 方向 h左 j下 k上 l右
---以單詞為單位跳轉
上一個單詞b 下一個單詞w 本單詞末尾e
刪除
刪除游標下字元:向後x(同插入模式下的del鍵) 向前X(同插入模式下的Backspace鍵)
向前或者向後刪除一個字元也可以: 按d 按左右鍵
向前或者向後刪除兩行:按d 按上下鍵
刪除游標所在行dd
刪除游標所在單詞dw
刪除多行或者多個單詞 ndd ndw
替換單個字元(將源字元替換為x) rx
將游標所在字元大小寫轉換 ~
複製粘貼
複製行 yy
複製單詞 yw(不忽略空格,連續空格算做一個單詞)
複製n個單詞、行:nyy nyw
粘貼pp 多次粘貼npp
替換模式操作:
普通模式輸入R進入之後操作(同插入模式下ins鍵)
視圖模式操作:
普通模式按v進入
eg刪除3個字元
①進入v模式,方向選取3個字元
②按x或者d刪除之
eg 替換幾個字元為sss
①可視模式選取字元
②按r 按s 就將選定的字元都換位s字元了
命令模式:
①:進入命令模式
②輸入命令
③按下enter執行操作
主要命令有:
環境設置eg
set number 顯示行號
set nonnumber 取消顯示行號
set tabstop=2 設置tab鍵等價空格數
set shifwidth=2設置縮進為2個空格
更多設置請在命令模式下輸入:help去學習
ps:將更多合適的 環境設置聚合在配置文件.vimrc中保持vim編輯器個性化
塊模式下操作:
最常用用法-->>註釋一段代碼
ps,當我們不熟悉塊操作之時,要註釋一段代碼,貌似只能在插入模式下一行一行的插入//
這麼做,很是低效費事。
塊模式註釋一段代碼:
①按CTRL+V進入塊模式
②方向鍵選取需要註釋的行數
③按下I進入插入模式
④輸入//
⑤按esc退出
至此,註釋完成,ps模塊模式的做法是,對應選取的塊,以行為單位,每個行都按格式進行操作
取消註釋:
進入塊模式後,用x或者d刪除一行中的字元,按esc退出。這裡就不上圖了
鍛造之劍gcc/g++
①man瞭解基本選項
解釋:
-E 預處理過程,得到.i文件,保存巨集替換,條件編譯處理之後的文件
-S 編譯過程,獲得彙編代碼.s
-c獲取目標文件
-o獲取輸出文件,一般用於指定可執行文件。(中間生成文件也可以使用之指定filename)
一個命令獲取以上過程文件
gcc test.c -save-temps
註:gcc、g++預設是動態鏈接的,
指定為靜態鏈接的參數 -static
更多選項(相關問題請參考linux環境編程相關章節)
生成靜態鏈接庫
ar -rcs test.a test.o
使用靜態鏈接庫
gcc -o test main.c libstr.a
或者 “-l 庫名”
gcc -o test main.c -lstr
指定靜態庫路徑
gcc -o test main.c -L ./ -lstr
生成動態庫
gcc -shared -Wl, -soname,libstr.so -o libstr.so.l string.c
//-soname,libstr.so 表示生成動態庫別名為libstr.so
//-o libstr.so.l 實際動態鏈接庫文件
//-shared 表示生成的是一個動態鏈接文庫
配置文件 /etc/ld.so.conf
ldconfig -g顯示動態鏈接庫列表(緩存文件中的)
ldconfig 目錄名 將該目錄中動態鏈接庫放入系統緩存文件/etc/ld.so.cache
使用(同靜態鏈接庫的使用)
gcc -o test main.c -L ./ -lstr
錘煉之劍gdb
最後我們來看看gdb的使用了
基本功能
①設置斷點b
②顯示變數print
③單步執行 s(f11) n(f10) u(shift+f11)
④運行時修改變數值
⑤路徑跟蹤,堆棧調用展開bt
⑥線程切換
info thread 獲取線程信息
thread id 進入調試線程
簡單使用步驟
①編譯程式加入選項-g
gcc test.c -g
②調試可執行程式
gdb a.out
進入之後
當程式需要命令行參數時
③(可選)set args 參數值1 參數值2 參數值3
④顯示源代碼l (list 簡寫)
⑤斷點設置b main(breakpointer簡寫)可以設置斷點在行號,函數名,條件設置等
eg b 36 if i==2 當i==2時斷點
⑥執行 r (run)執行到斷點處停止
列印變數p value (print value)
監視變數display value (每次enter都會列印)
其他命令
斷點失效:
enable b 編號
i 列印信息
info顯示 eg
info b 顯示斷點信息
file path 載入文件
變數類型檢測 whatis value
最後說一個命令,也就是上圖中的調試過程中顯示的代碼框架
refresh
最後,關於linux下的makefile下次再解