vi 編輯器,gcc 編譯器的使用
vi編輯器是我們在linux下經常使用的文本編輯器,這個東西也是專門為程序員準備的,基本上每個Unix和Linux系統都為我們提供了這個軟件,我們可以使用vi來編寫我們的代碼。在vi編輯器下所有操作都必須通過鍵盤和特定的快捷鍵組合來完成,剛開始學習的新手會感覺不太容易,但是這個東西很重要,我們先來學習如何使用它,掌握了這個東西去面試的時候也算是一門技能。而vim是vi的增強版,新增加了很多功能。
在shell下輸入命令vi 文件名,例如:vi first.c,就開始編輯first.c文件了。vi編輯器有三種模式,它們分別為命令模式,底行命令模式和編輯模式,各個模式的轉換如下。
命令模式(按i進入編輯模式。按":"進入底行命令模式)。當我們vi first.c的時候一進入就是命令模式,在這個模式下,我們可以執行如下的操作。
x:刪除一個字符
dd:刪除光標所在行
ndd:刪除n行
p:粘貼光標下行,就是把復制的內容粘貼到光標所在行的下一行。
yy:復制光標所在行
nyy:復制n行
u:恢復上一次操作
編輯模式(按Esc回到命令模式,然后再按下:就到了底行命令模式)。在命令模式的時候我們按下i鍵就進入了這個模式,這個時候就可以編輯文字了。我們輸入的每個字符都會寫上去,不像命令模式那樣字符代表的是一種命令。
底行命令模式 :支持如下的一些常用命令,你輸入這些字符的時候觀察vi編輯器的下邊,每個字符都會出現在底邊的一行,就像一個只有一行的命令窗口。
w:保存文件
q:退出vi編輯器
!:強制
wq:保存退出,這個是我們經常用的,當我們寫完代碼的時候就用這個命令,保存退出到shell下。
q!:強制退出 這個也是我們常用的,當我們看完了自己的代碼,不希望修改的代碼生效,就是這個命令。
%s/str1/str2/g :把當前文件的str1全部替換為str2
/str:查找字符串str
set nu:顯示行號 在vi編輯器的左側可以顯示出行號,沒有行號的話就用這個命令顯示。
set nonu:不顯示行號
好了vi編輯器就說到這,大家多用幾次就熟了。下面來說gcc編譯器。 我們在windows下寫程序的時候,用的都是圖形化的集成工具,像什么vc++6.0啦vs各個系列的版本啦,這些工具都集成了代碼的編輯,編譯,鏈接 等操作。但是在linux下就不行了,我們寫好了代碼需要我們自己手動的編譯,鏈接,生成可執行文件。所以說在linux下學習c語言你才真正的了解它, 可以學的更加深入!下面我們就來說這個工具gcc編譯器。
gcc 編譯器
gcc xx.c 使用這個命令就會生成最終的可執行文件a.out(在shell下使用./a.out就可以執行你的程序了),他把下面的幾步都隱藏了。
1,預處理:針對指令
2,編譯:語法的檢測
3,匯編:從高級語言->匯編語言->機器語言
4,連接:把用到的各種資源打包到一起
在使用gcc xx.c這個命令的時候我們帶一些選項字段可以做一些更改,常用的字段如下所示:
-o 改變目標的文件名 例如gcc first.c -o first這樣的話,最后的可執行文件名就不是a.out了,而是first
-E 預處理
-S 匯編 以上這倆個選項我也不知道怎么用,反正還沒用過。
-l 鏈接庫名 這個是要用到的,鏈接庫的名稱一般是libxxx.so,我們使用的時候就用 -lxxx就行了
-L 指定庫的路徑 這個也是經常用的
-I 指定頭文件的路徑
-c 只編譯不鏈接 這個時候不會生產可執行文件,而是編譯以后的.o文件
-Wall 顯示更多的警告
-O1、O2、O3:優化級別
動態庫的創建和使用
首先我們說一下什么是庫,庫說白了就是別人寫好的程序。我們寫程序不可能從頭開始,肯定會調用到這些寫好的庫來為我們完成一些功能。庫分為靜態庫和動態庫,它們都是在鏈接的時候才使用的。windows 下的靜態庫是以.lib結尾的,動態庫是以.dll結尾的,linux下分別是以.a和.so結尾的。靜態庫在鏈接的時候就會嵌入到程序中,而動態庫是程 序在運行的時候才會調用的,他們的優缺點大家可以自行百度、google。那么我們就來說一下linux下如何創建和使用動態庫吧。動態庫又叫共享庫,它是代碼的合集,在使用的時候提供代碼庫中的地址。
1創建共享庫
寫源代碼
編譯源代碼,生成目標文件add.o。使用命令gcc -c add.c
生成共享庫。使用命令gcc -shared add.o -o libadd.so
2使用動態庫
寫源代碼main.c
編譯gcc -c main.c
連接gcc main.o -ladd -L.
如果直接運行可執行文件會出錯(因為鏈接的時候只是在可執行文件中寫進去了動態庫中函數的地址,但是動態庫的文件在什么地方還不知道),需要在運行時配置環境變量LD_LIBRARY_PATH
使用命令:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. 那個.是我的路徑,你可以換成你自己的路徑。