Linux開發工具的使用

double2li發表於2015-06-03

 

 

 

1.   Linux開發工具的使用

Vim編譯的使用

Ibm的Vim 實用技術

http://www.ibm.com/developerworks/cn/linux/l-tip-vim1/index.html

http://www.ibm.com/developerworks/cn/linux/l-tip-vim2/index.html

http://www.ibm.com/developerworks/cn/linux/l-tip-vim3/index.html

 

l         跳轉命令:

^,$        游標移動至行首、行尾

(,)         一句話的最前面、最後面

{,}        一個段落的最前面、最後面

H          跳到第一行

M          跳到中間一行

L          跳到最後一行

gg         跑到檔案開頭

G          跑到檔案結尾

 

查詢命令

/?查詢,  s/查詢內容/替換內容

 

編輯命令

複製:     y複製選擇的內容、yy複製一行、nyy複製n行

剪貼       d

貼上:     p; ]p程式碼貼上

刪除:     d刪除選擇的內容、dd刪除一行、dw刪除一個單詞

取消:     u

更改:     cw更改游標所在位置的一個字

 

刪除或稱謂剪貼

db 刪除到某個單詞的開始位置

d) 刪除到某個語句的結尾位置

d( 刪除到某個語句的開始位置

d} 刪除到某個段落的結尾位置

d{ 刪除到某個段落的開始位置

D 刪除到某一行的結尾=d$

 

修改

cl 更改當前字元(等於先按x再按i)

cw 修改到某個單詞的結尾位置(dw再i)

cb 修改到某個單詞的開始位置(db再i)

<<         程式碼向前移動

>>         程式碼向後移動

 

 

 

視窗命令

:split/vsplit  分隔一個視窗

:new/vnew      建立一個新的視窗

:sf 檔名     在新視窗中開啟filename

:only          關閉除當前視窗外所有視窗

:ctrl-w        可進行切換視窗

:ctrl-w h      到左面的視窗

:ctrl-w l      到右面的視窗

:ctrl-w j      到下面的視窗

:ctrl-w k      到上面的視窗

 

 

 

set paste //在貼上之前使用該命令, 就不會在貼上的時候將格式搞亂,貼上之後再使用set nopaste即可將自動格式命令開啟
set complete+=k // 自動完成?
setlocal omnifunc=syntaxcomplete#Complete        //”開啟語法開啟補全
dw,剪下單詞。d$,剪下到行尾。d0,剪下到行首。[n]dd,剪下一行或下面n行。
yw,複製單詞。y$,複製到行尾。y0,複製到行首。[n]yy,複製一行或下面n行。
 
 
寫程式碼的時候的快捷鍵:
    ]p:和 p 的功能差不多,但是它會自動調整被貼上的文字的縮排去適應當前程式碼的位置。
    gd:定位到區域性變數宣告處
    K:在 Man 裡面查詢游標當前所在處的詞,顯示游標下的C函式的man說明手冊
    ^P/^n 自動完成功能;如果沒有合適的就一直按C-P/N
    ^]:顯示~/.tags中的游標下的函式的原型,
    ^t:退出函式的原型視窗
 
 
在編譯一個檔案時候同時開啟另外一個檔案
:sp                      [filename]
CTRL-W h                 跳轉到左邊的視窗
CTRL-W j                 跳轉到下面的視窗
CTRL-W k                 跳轉到上面的視窗
CTRL-W l                 跳轉到右邊的視窗
 
 
生成C語言標準函式庫的tag檔案
ctags -R -f ~/.vim/systags –c-kinds=+p –fields=+S /usr/include /usr/local/include 
再在.vimrc加上 ctags+=~/.vim/systags 
這樣每次生成ctags只生成本工程下的,但使用時卻又能包括標準介面。 
 
$ctags -R *   (將當前目錄和子目錄中的檔案生成tag)
$vi -t find   (在目錄中查詢find函式)
:ts   find    (檢視find函式)
:ta   find    (檢視find函式)
 

 

Gdb除錯工具的使用

gdb程式碼除錯參考

http://fanqiang.chinaunix.net/program/other/2005-03-23/2993.shtml
 
1. 設定斷點
(gdb)b test.c:17     //表示在17行設定斷點
(gdb)b test.c:func  //表示在test.c檔案中func函式開始的地方設定斷點
(gdb)b test.c:21 if result==20 //斷點的觸發的條件是result==20
(gdb)info b            //檢視斷點的資訊
(gdb)delete、enable、disable、clear、// 維護斷點
 
run[r]//執行
continue[c] //繼續執行
next[n]      //下一條語句;不會進出函式內部
step[s]      //會進出呼叫的函式內部
finish         //退出函式
 
注意:在輸入b按兩次tab鍵,會列出所有以b開頭的命令
 
 
2. 檢視斷點變數內容
backtrace[bt]//列印當前的函式呼叫棧的所有資訊
bt n             //是一個正整數,表示只列印棧頂上n層的棧資訊
                  //-n表一個負整數,表示只列印棧底下n層的棧資訊
frame(f) n    //表示檢視當前棧某層資訊
info f           //列印出更為詳細的當前棧層的資訊;
info args      //列印出當前函式的引數名及其值
info locals    //列印出當前函式中所有區域性變數及其值
info catch    //列印出當前的函式中的異常處理資訊
 
@   //運算元組
(gdb)p/c *array@10   //列印array後面10個字元的內容,按照字元檢視
(gdb)p/x *array@10   //按照16進位制檢視
(gdb)p  this              //檢視this的資料
 
::  //指定某檔案、類、函式中的變數
(gdb)p “test.c”::m_test      //檢視test.c檔案中的變數
{}     //一個記憶體地址為type的物件
 
3.檢視原始碼
(gdb)l n,fun             //顯示程式第n行或某函式週圍的程式碼
(gdb)l CTest::get_count  //檢視CTest類中get_count函式
 

 

Makefile的編寫

 

make的基本介紹[Makefile]

make是一個有規則的文字檔案,每個規則由三部分組成:目標、依賴檔案、命令列表
target: dep1 dep2 dep3 …
    command1
    command2
    ……
注意:每個命令前面是製表符不能用空格代替!
 
例如:
ipphone : ipphone.o
    gcc -o ipphone ipphone.o
ipphone.o: ipphone.c ipphone.h
    gcc -c ipphone.c
ctl: ctl.o
    gcc -o ctl ctl.o
ctl.o: ctrl.c ipphone.h
    gcc -c ctl.c
上面有四個規則;如果make命令列中沒有包含規則名就會檢查所有的規則,如果有則只檢查該規則,例如只想生成ctl檔案需要make ctl即可!
 

偽目標

例如:all: ctl ipphone //這是因為all並不存在它只是檢查ctl和ipphone作用
例如:clean: rm -f *.o //由於沒有依賴檔案所以預設不會執行,可通過 make clean執行
 

make定義變數和使用變數

為了make檔案的編輯和維護更方便,可在make中定義變數、和shell一樣;make檔案中的變數內容實際是一個字串,定義和使用規則同shell差不多。
 
CC=gcc -c  使用的時候和shell類似用括號擴起來前面加$;$(CC) 
變數定義時候引用了自己make會遞迴展開引發錯誤:
 
make提供的只讀變數:
$@      目標檔名
$<       第一個相關的檔名
$^      相關檔案列表、以空格分開
$?       新於目標檔案的相關檔案列表
$(@D) 目標檔名的目錄部分
$(@F) 目標檔名的檔名部分
 

make預定義變數:

AS 彙編器
CC C編譯器,預設cc
CPP C前處理器,預設值cpp
RM 檔案刪除程式,預設rm -f
 
 

隱含規則和規則模式

例如:ipphone : ipphone.o
gcc -o ipphone ipphone.o
該規則沒有指出ipphone.o怎麼得來,這就適合隱含規則make會自動使用
gcc -c ipphone.c -o ipphone.o命令生成ipphone.o檔案。這個規則也可通過%.o : %.c重新定義、表示所有的.o檔案都是通過.c檔案編譯而來;或者通過下面的方式重定義:
%.o : %.c
  $(CC) -c $< -o $@ //表示使用第一個相關的檔名來生成目標檔名
 

make命令列的選項:

-f 指定make檔名不適用預設值
-n 顯示所有要執行的命令,但不執行
-s 執行時不顯示命令
-r 禁止make內部規則
-d 顯示除錯資訊
-i 忽略規則的命令錯誤,繼續執行
-k 忽略模組編譯錯誤、繼續下面的編譯
 
編譯的引數
引數資訊
-Wall:          輸出所有的警告資訊。
-O:              在編譯時進行優化。
-g:               表示編譯debug版本。
 

基本寫法 
filestat: filestat.o
    gcc filestat.o -o filestat
filestat.o:
    gcc -c filestat.c
clean:
    rm -fr *.o *~ *.*~ filestat
———————————————-
改善之後的寫法
object = filestat.o        // 使用目標檔案
cc = gcc                    // 編譯器定義
cflags = -Wall -O -g     // 編譯條件
 
filestat: $(object)                          // 由.o檔案連線成   程式檔案
    $(cc) $(object) -o filestat
filestat.o:                                     // 由.c檔案編譯成   目標檔案
    $(cc) $(cflag)  -c filestat.c -o filestat.o
clean:
    rm -fr *.o *.*~ *~ filestat
———————————————-optimization
cc = gcc
cflag = -Wall -O -g
TARGET = ./filestat

OBJECTS = $(patsubst %.c,%.o,$(wildcard *.c))  //將當前路徑中所有.c檔案擴充套件替換為

 

            wildcard( %.c); #將目錄中所有以.c字尾的檔名,存入一個列表變數中

            patsubst( %.c, %.o, listvar);  #表示將listvar中所有以.c為字尾的檔案,改為以.o為字尾檔案

 

 

%.o: %.c
    $(cc) $(cflag) -c $< -o $@            //採用gcc -cflag -c第一個相關聯的檔案 -o 目標檔案
$(TARGET): $(OBJECTS)                 
    $(cc) $(OBJECTS) -o $(TARGET)     //將當前.o檔案連線成目標程式檔案
    chmod a+x $(TARGET)
subsystem:
    cd subdir && $(MAKE)                   // 進入子目錄進行make
clean:
    rm -fr *.o $(TARGET) *~  

 

======================================================

 

在test下,建立a.c和b.c2個檔案,在sub目錄下,建立sa.c和sb.c2 個檔案
建立一個簡單的makefile
src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(dir) )
obj2=$(dir:%.c=%.o)
all:
 @echo $(src)
 @echo $(dir)
 @echo $(obj)
 @echo $(obj2)
 @echo “end”
 
第一行輸出:wildcard把指定目錄 ./ 和 ./sub/ 下的所有字尾是c的檔案全部展開。
a.c b.c ./sub/sa.c ./sub/sb.c
 
第二行輸出:notdir把展開的檔案去除掉路徑資訊
a.c b.c sa.c sb.c
 
第三行輸出:patsubst把$(dir)中的變數符合字尾是.c的全部替換成.o,
a.o b.o sa.o sb.o
 
第四行輸出:把變數dir中的每一個值結尾用o替換掉c
a.o b.o sa.o sb.o
 
 

 


linux跟蹤除錯

 

-Wall 使用它能夠使GCC產生儘可能多的警告資訊
 
1、Linux下的大多數函式都預設:
   標頭檔案放到/usr/include/目錄下
   而庫檔案則放到/usr/lib/目錄下
   -I 選項:增加標頭檔案目錄
   -L 選項:增加庫檔案目錄
 
 
gdb除錯程式
 
1.顯示資料:print或p 變數print *指標
2.檢視陣列:人為陣列:檢視記憶體中變數h後面的10個整數: print h@10
3.設定斷點:b line-or-func if testvalue==100
  顯示斷點:info b
  刪除斷點:delete b 1
4.執行:
next:單步執行
setp:進入一個內部函式
finish:跳出該內部函式
list列出下面要執行的原始碼
run 開始除錯程式
set 變數//給該變數賦值
pype 顯示一個資料結構的內容(C的結構或函式)
p/x  i //按16進位制顯示變數內容,/c按字元/
x/   //examine簡拼為x,n是記憶體的長度,f 表示顯示的格式,u 表示從當前地址往後請求的位元組數
      x/3uh 0x54320//表示檢視0x54320後面3個位元組長度按照無符號
 
自動顯示:
display
display/
display/

 

 

SSH的使用

Linux與Linux之間傳送檔案:
scp LocalFile  username@remoteIP:[path or remoteFile]
scp p2p-tracker root@124.127.108.231:/usr/share/p2p-tracker/
 
 

subversion的使用

安裝subversion
sudo apt-get install subversion subversion-tools

 

1、將檔案checkout到本地目錄

svn checkout path(path是伺服器上的目錄)
    例如:svn checkout svn://192.168.1.1/pro/domain     #表示將url中的檔案checkout到本地
    簡寫:svn co

2、往版本庫中新增新的檔案

  svn add file
   例如:svn add test.php(新增test.php)                   #將test.php新增到svn上面,其路徑是當前目錄所在svn路徑
                                                         #add之後commit才能真正將檔案加入到svn上面

3、將改動的檔案提交到版本庫

svn commit -m “LogMessage” 
例如:svn commit -m “add file” test.php                #只提交test.php檔案
例如:svn ci                                           #提交當前目錄所有的檔案

4、加鎖/解鎖

  svn lock -m “LockMessage” [–force] PATH
   例如:svn lock -m “lock test file” test.php
        svn unlock PATH

5、更新到某個版本

  svn update -r m path
   例如:
      svn update如果後面沒有目錄,預設將當前目錄以及子目錄下的所有檔案都更新到最新版本。
     svn update -r 200 test.php(將版本庫中的檔案test.php還原到版本200)
     svn update test.php(更新,於版本庫同步。如果在提交的時候提示過期的話,是因為衝突,需要先update,修改檔案,然後清除svn resolved,最後再提交commit)
   簡寫:svn up

6、檢視檔案或者目錄狀態

  1)svn status path(目錄下的檔案和子目錄的狀態,正常狀態不顯示)
   【?:不在svn的控制中;M:內容被修改;C:發生衝突;A:預定加入到版本庫;K:被鎖定】
  2)svn status -v path(顯示檔案和子目錄狀態)
   第一列保持相同,第二列顯示工作版本號,第三和第四列顯示最後一次修改的版本號和修改人。
   注:svn status、svn diff和 svn revert這三條命令在沒有網路的情況下也可以執行的,原因是svn在本地的.svn中保留了本地版本的原始拷貝。
簡寫:svn st

7、刪除檔案

  svn delete path -m “delete test fle”
   例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file”
    或者直接svn delete test.php 然後再svn ci -m ‘delete test file‘,推薦使用這種
簡寫:svn (del, remove, rm)

8、檢視日誌

  svn log path
   例如:svn log test.php 顯示這個檔案的所有修改記錄,及其版本號的變化

9、檢視檔案詳細資訊

  svn info path
   例如:svn info test.php

10、比較差異

  svn diff path(將修改的檔案與基礎版本比較)
   例如:svn diff test.php
svn diff -r m:n path(對版本m和版本n比較差異)
   例如:svn diff -r 200:201 test.php
   簡寫:svn di

11、將兩個版本之間的差異合併到當前檔案

  svn merge -r m:n path
   例如:svn merge -r 200:205 test.php(將版本200與205之間的差異合併到當前檔案,但是一般都會產生衝突,需要處理一下)

12、SVN 幫助

  svn help
svn help ci

——————————————————————————

以上是常用命令,下面寫幾個不經常用的

——————————————————————————

13、版本庫下的檔案和目錄列表

  svn list path
   顯示path目錄下的所有屬於版本庫的檔案和目錄
簡寫:svn ls

 

14、建立納入版本控制下的新目錄

 

svn mkdir: 建立納入版本控制下的新目錄。
用法: 1、mkdir PATH…
         2、mkdir URL…
建立版本控制的目錄。
1、每一個以工作副本 PATH 指定的目錄,都會建立在本地端,並且加入新增
     排程,以待下一次的提交。
2、每個以URL指定的目錄,都會透過立即提交於倉庫中建立。
在這兩個情況下,所有的中間目錄都必須事先存在。

 

 

15、恢復本地修改

 

svn revert: 恢復原始未改變的工作副本檔案 (恢復大部份的本地修改)。revert:
用法: revert PATH…
注意: 本子命令不會存取網路,並且會解除衝突的狀況。但是它不會恢復
        被刪除的目錄

 

 

16、程式碼庫URL變更

 

svn switch (sw): 更新工作副本至不同的URL。
用法: 1、switch URL [PATH]
        2、switch –relocate FROM TO [PATH…]

1、更新你的工作副本,對映到一個新的URL,其行為跟“svn update”很像,也會將
     伺服器上檔案與本地檔案合併。這是將工作副本對應到同一倉庫中某個分支或者標記的
     方法。
2、改寫工作副本的URL後設資料,以反映單純的URL上的改變。當倉庫的根URL變動 
    (比如方案名或是主機名稱變動),但是工作副本仍舊對映到同一倉庫的同一目錄時使用
    這個命令更新工作副本與倉庫的對應關係。

 

 

17、解決衝突

 

svn resolved: 移除工作副本的目錄或檔案的“衝突”狀態。
用法: resolved PATH…
注意: 本子命令不會依語法來解決衝突或是移除衝突標記;它只是移除衝突的
        相關檔案,然後讓 PATH 可以再次提交。

 

 

18、輸出指定檔案或URL的內容。

 

svn cat 目標[@版本]…如果指定了版本,將從指定的版本開始查詢。
svn cat -r PREV filename > filename (PREV 是上一版本,也可以寫具體版本號,這樣輸出結果是可以提交的)

 


相關文章