Linux環境搭建(vim,makefile,gdb...)

1、vim(編輯器)的使用
vim是vi的升級版本,二者都是多模式編輯器,vim兼容了vi的所有指令,同時還增加了一些新的特性在裏面。
vi的三種基本模式:(vi有很多種模式,目前僅需掌握這三種)
1》命令模式:控制屏幕光標的移動,字符、字或行的刪除,移動複製某區段及進入其他兩種模式的中間模式。
2》插入模式:進行文字的輸入,按【ESC】回到命令模式。
3》底行模式:將文件保存或退出vim,也可以設置編輯環境,如尋找字符串、列出行號等。
(底行模式本質上也屬於命令模式)

命令模式->插入模式:[i]、[a]、[o]
i:從光標當前位置進行輸入
a:從光標的下一個位置進行輸入
o:插入新的一行,從行首進行輸入
命令模式->底行模式:[:]
: w (保存當前文件)
: wq (輸入「wq」,存盤並退出vim)
: q! (輸入q!, 不存盤強制退出vim)
進入命令模式:[ESC]

vi下命令模式下移動光標
「h」、「j」、「k」、「l」,分別控制光標左、下、上、右移一格。
按「ctrl」+「b」:屏幕往“前”移動一頁。
按「ctrl」+「f」:屏幕往“後”移動一頁。
按「ctrl」+「u」:屏幕往“前”移動半頁。
按「ctrl」+「d」:屏幕往“後”移動半頁。

按「G」:移動到文章的最後。
按「$」:移動到光標所在行的“行尾”
按「^」:移動到光標所在行的“行首”
按「w」:光標跳到下個字的開頭

按「e」:光標跳到下個字的字尾
按「b」:光標回到上個字的開頭
按「#l」:光標移到該行的第#個位置,如:5l,56l。
按[gg]:進入到文本開始
按[shift+g]:進入文本末端

.刪除文字
「x」:每按一次,刪除光標所在位置的一個字符。
「#x」:例如,「6x」表示刪除光標所在位置的“後面(包含自己在內)”6個字符。
「X」:大寫的X,每按一次,刪除光標所在位置的“前面”一個字符。
「#X」:例如,「20X」表示刪除光標所在位置的“前面”20個字符。
「dd」:刪除光標所在行。
「#dd」:從光標所在行開始刪除#行

.複製
「yw」:將光標所在之處到字尾的字符複製到緩衝區中。
「#yw」:複製#個字到緩衝區
「yy」:複製光標所在行到緩衝區。
「#yy」:例如,「6yy」表示拷貝從光標所在的該行“往下數”6行文字。
「p」:將緩衝區內的字符貼到光標所在位置。注意:所有與“y”有關的複製命令都必須與“p”配合才能完成複製與粘貼功能。

替換
「r」:替換光標所在處的字符。
「R」:替換光標所到之處的字符,直到按下「ESC」鍵爲止。

撤銷上一次的操作
「u」:如果您誤執行一個命令,可以馬上按下「u」,回到上一個操作。按多次“u”可以執行多次回覆。

跳到指定行
「ctrl」+「g」列出光標所在行的行號。
「#G」:例如,「15G」,表示移動光標至文章的第15行行首。

2、gcc,g++(編譯器)的使用
編譯過程:
a. 預處理(進行宏替換)—-> .i
b. 編譯(生成彙編)—-> .s
c. 彙編(生成機器可識別代碼)—-> .o
d. 鏈接(生成可執行文件或庫文件)

“-E” 預處理
“-S” 編譯(生成彙編)
“-c” 彙編(生成機器可執行代碼)
“-o” 鏈接(生成可執行文件或庫文件)
預處理功能主要包括宏定義,文件包含,條件編譯三部分。
預處理過程讀入源代碼,檢查包含預處理指令的語句和宏定義,並對源代碼進行響應的轉換。預處理過程還會刪除程序中的註釋和多餘的空白字符。
文件包含:
<>:這種格式告訴預處理程序在編譯器自帶的或外部庫的頭文件中搜索被包含的頭文件.
” “:這種格式告訴預處理程序在當前被編譯的應用程序的源代碼文件中搜索被包含的頭文件,如果找不到,再搜索編譯器自帶的頭文件.

編譯:
在這個階段中,gcc 首先要檢查代碼的規範性、是否有語法錯誤等,以確定代碼的實 際要做的工作,在檢查無誤後,gcc 把代碼翻譯成彙編語言。

彙編:將彙編代碼轉換成二進制代碼

鏈接:生成可執行文件或庫文件
函數庫:靜態庫、動態庫
靜態庫是指編譯鏈接時,把庫文件的代碼全部加入到可執行文件中,因此生成的文件比較大,但在運行時也就不再需要庫文件了。其後綴名一般爲“.a”。
動態庫與之相反,在編譯鏈接時並沒有把庫文件的代碼加入到可執行文件中,而是在程序執行時由運行時鏈接文件加載庫,這樣可以節省系統的開銷。動態庫⼀一般後綴名爲“.so”。
gcc在編譯時默認使用動態庫。

gcc -o hello hello.c可分解爲以下幾步完成:
預處理:gcc -E hello.c -o hello.i
編譯:gcc -S hello.i -o hello.s
彙編:gcc -c hello.s -o hello.o
連接:gcc hello.o -o hello
選項“-o”是指目標文件

gcc 總體選項列表:
-S 只是編譯不彙編,生成彙編代碼
-E 只進行預編譯,不做其他處理
-c 只是編譯不鏈接,生成目標文件“.o” (常用)
-o 文件 輸出到 文件
-w 不生成任何警告信息。
-g 生成調試信息。GNU 調試器可利用該信息。

gcc與g++的區別:
誤區一:gcc只能編譯c代碼,g++只能編譯c++代碼
兩者都可以,但是請注意:
1.後綴爲.c的,gcc把它當作是C程序,而g++當作是c++程序;後綴爲.cpp的,兩者都會認爲是c++程序。
2.編譯階段,g++會調用gcc,對於c++代碼,兩者是等價的,但是因爲gcc命令不能自動和C++程序使用的庫聯接,所以通常用g++來完成鏈接。

誤區二:gcc不會定義__cplusplus宏,而g++會
實際上,這個宏只是標誌着編譯器將會把代碼按C還是C++語法來解釋,如上所述,如果後綴爲.c,並且採用gcc編譯器,則該宏就是未定義的,否則,就是已定義。

誤區三:編譯只能用gcc,鏈接只能用g++
嚴格來說,這句話不算錯誤,但是它混淆了概念,應該這樣說:編譯可以用gcc/g++,而鏈接可以用g++或者gcc -lstdc++。因爲gcc命令不能自動和C++程序使用的庫聯接,所以通常使用g++來完成聯接。但在編譯階段,g++會自動調用gcc,二者等價。

誤區四:extern “C”與gcc/g++有關係
實際上並無關係,無論是gcc還是g++,用extern “c”時,都是以C的命名方式來爲symbol命名,否則,都以c++方式命名。

3、gdb(Linux下的調試器)的使用
1介紹: gdb是Linux環境下的代碼調試工具。
2使用:需要在源代碼生成的時候加上 -g 選項.
3開始使用: gdb binFile
4退出:ctrl + d 或 quit
5調試過程:
l ist/l 行號:顯示binFile源代碼,接着上次的位置往下列,每次列10行。
list/l 函數名:列出某個函數的源代碼。
r或run:運行程序。
s或step:進入函數調用
breaktrace(或bt):查看各級函數調用及參數
info(i) locals:查看當前棧幀局部變量的值
info break :查看斷點信息。
finish:執行到當前函數返回,然後挺下來等待命令
print(p):打印表達式的值,通過表達式可以修改變量的值或者調用函數
set var:修改變量的值
quit:退出gdb
break(b) 行號:在某一行設置斷點
break 函數名:在某個函數開頭設置斷點
continue(或c):從當前位置開始連續而非單步執行程序
run(或r):從開始連續而非單步執行程序
delete breakpoints:刪除所有斷點
delete breakpoints n:刪除序號爲n的斷點
disable breakpoints:禁用斷點
enable breakpoints:啓用斷點
info(或i) breakpoints:參看當前設置了哪些斷點
display 變量名:跟蹤查看一個變量,每次停下來都顯示它的值
undisplay:取消對先前設置的那些變量的跟蹤
until X行號:跳至X行
6直接回
n 或 next:單條執行。
p 變量:打印變量值。

4、ctags(Linux下的代碼查看)工程常使用
ctags -R : 在當前目錄下建立索引。
ctrl + ]:跳轉到函數或變量的定義處。
ctrl + T : 跳轉至上級

5、Makefile—-自動化編譯
make命令執行時,需要一個 Makefile 文件,以告訴make命令需要怎麼樣的去編譯
和鏈接程序。
編寫Makefile的規則:
1.如果這個工程沒有編譯過,那麼我們的所有C文件都要編譯並被鏈接。
2.如果這個工程的某幾個C文件被修改,那麼我們只編譯被修改的C文件,並鏈 接目標程序。
3.如果這個工程的頭文件被改變了,那麼我們需要編譯引用了這幾個頭文件的C 文件,並鏈接目 標程序。

在定義好依賴關係後,後續的那一行定義瞭如何生成目標文件的操作系統 命令,一定要以一個Tab鍵作爲開頭。
make並不管命令是怎麼工作的,他只管執行所定義的命令。
clean不是一個文件,它只不過是一個動作名字,有點像C 語言中的lable一樣,其冒號後什麼也沒有,那麼,make就不會自動去找文件的依賴 性,也就不會自動執行其後所定義的命令。

make是如何工作的?
1 make會在當前目錄下找名字叫“Makefile”或“makefile”的文件。
2 如果找到,它會找文件中的第一個目標文件(target),並把這個文件作爲最終的目標文 件。
3 如果目標文件不存在,或是目標文件所依賴的後面的 .o 文件的文件修改 時間要比當前這個文件新,那麼,他就會執行後面所定義的命令來生 成當前這個目標文件。
4 如果目標所依賴的.o文件也存在,那麼make會在當前文件中找目標 爲.o文件的依賴性,如果找到則再根據那一個規則生成.o文件。(這 有點像一個堆棧的過程)
5 當然,你的C文件和H文件是存在的啦,於是make會生成 .o 文件, 然後再用 .o 文件聲make的終極任務,也就是執行目標文件了。
以上就是整個make的依賴性,make會一層又一層地去找文件的依賴關係, 直到最終編譯出第一個目標文件。如果沒找到依賴文件,make就會報錯退出。
通過上述分析,我們知道,像clean這種,沒有被第一個目標文件直接 或間接關聯,那麼它後面所定義的命令將不會被自動執行,不過,我們可 以顯⽰示要make執行。即命令——“make clean”,以此來清除所有的目標 文件,以便重編譯。

清空目標文件的規則:
每個Makefile中都應該寫一個清空目標文件(.o和執行文件)的規則,這不僅便於 重編譯,也很利於保持文件的清潔。
一般的風格都是:
clean:
rm file (objects).PHONY:cleanclean:rmfile (objects)
.PHONY意思表示clean是一個“僞目標”,而在rm命令前面加了一個小減 號的意思就是,也許某些文件出現問題,但不要管,繼續做後面的事。clean從來都是放在文件的最後。

僞目標一般沒有依賴的文件。但是,我們也可以爲僞目標指定所依賴的文件。僞目標同樣可以作爲“默認目標”,只要將其放在第一個。
實例:如果你的Makefile需要一口氣生成若干個可執行文件,但你只想簡單地敲一個make完事,並且,所有的目 標文件都寫在一個Makefile中,那麼你可以使用“僞⽬目標”這個特性:
all : prog1 prog2 prog3
.PHONY : all
prog1 : prog1.o utils.o
cc -o prog1 prog1.o utils.o
prog2 : prog2.o
cc -o prog2 prog2.o
prog3 : prog3.o sort.o utils.o
cc -o prog3 prog3.o sort.o utils.o
一般的,Makefile中的第一個目標會被作爲其默認目標。我們聲明瞭一個“all”的僞目 標,其依賴於其它三個目標。由於僞目標的特性是,總是被執行的,所以其依賴的那 三個目標就總是不如“all”這個目標新。所以,其它三個目標的規則總是會被決議。也 就達到了我們一口氣生成多個目標的目的。“.PHONY : all”聲明瞭“all”這個目標爲“僞 目標”。

命令執行:
目標中的”%”定義表示對文件名的匹配,”%”表示長度任意的非空字符 串。

foreach函數:做循環時用
它的語法是: $(foreach ,, )
這個函數的意思是,把參數中的單詞 逐一取出放到參數所指定的變量中,然後再執行所包含的表 達式。最後當整個循環結束時,所返回的每個 字符串所組成的整個字符串(以空格分隔)將會是foreach函數的返回值。
注意,foreach中的參數是一個臨時的局部變量,foreach函數執行完後,參數的變量將不在作用,其作用域只在foreach函數當中。

shell函數:
它的參數應該就是操作系統Shell 的命令。它和反引號“`”是相同的功能。這就是說,shell函數把執行操作系 統命令後的輸出作爲函數返回。
Makefile 有三個非常有用的變量:@ ^,< @:目標文件
<:第一個依賴文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章