Linux开发
目錄
Linux開發工具
Linux編輯器-vim使用
1. vim的基本概念
2. vim的基本操作?
3. vim正常模式命令集
4. vim末行模式命令集?
Linux編譯器-gcc/g++使用
1. 背景知識
2. gcc如何完成
Linux調試器-gdb使用
1. 背景
2. 開始使用
3.獲取程序運行中的PID和PPID
?
Linux項目自動化構建工具-make/Makefifile
背景
理解
實例代碼
依賴關系
依賴方法
原理
項目清理
Linux第一個小程序-進度條
\r&&\n
行緩沖區概念
yum?
使用 git 命令行
安裝 git
下載項目到本地
Linux開發工具
- IDE(集成)例子
Linux編輯器-vim使用
vi/vim的區別簡單點來說,它們都是多模式編輯器,不同的是vim是vi的升級版本,它不僅兼容vi的所有指令,而且還有一些新的特性在里面。例如語法加亮,可視化操作不僅可以在終端運行,也可以運行于x window、 mac os、windows。1. vim的基本概念
vim最基本的三種模式,分別是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能區分如下:- 正常/普通/命令模式(Normal mode)
- 插入模式(Insert mode)
- 末行模式(last line mode)
?
2. vim的基本操作?
- 進入vim,在系統提示符號輸入vim及文件名稱后,就進入vim全屏幕編輯畫面:
- $ vim test.c
- 不過有一點要特別注意,就是你進入vim之后,是處于[正常模式],你要切換到[插入模式]才能夠輸入文字。
- [正常模式]切換至[插入模式]
- 輸入a
- 輸入i
- 輸入o
- [插入模式]切換至[正常模式]
- 目前處于[插入模式],就只能一直輸入文字,如果發現輸錯了字,想用光標鍵往回移動,將該字刪除,可以先按一下「ESC」鍵轉到[正常模式]再刪除文字。當然,也可以直接刪除。
- [正常模式]切換至[末行模式]
- 「shift + ;」, 其實就是輸入「:」
- 退出vim及保存文件,在[正常模式]下,按一下「:」冒號鍵進入「Last line mode」,例如:
- : w (保存當前文件)
- : wq (輸入「wq」,存盤并退出vim)
- : q! (輸入q!,不存盤強制退出vim)
3. vim正常模式命令集
4. vim末行模式命令集?
?
Linux編譯器-gcc/g++使用
1. 背景知識
2. gcc如何完成
格式 gcc [選項] 要編譯的文件 [選項] [目標文件] 預處理(進行宏替換)- 預處理功能主要包括宏定義,文件包含,條件編譯,去注釋等。
- 預處理指令是以#號開頭的代碼行。
- 實例: gcc –E hello.c –o hello.i
- 選項“-E”,該選項的作用是讓 gcc 在預處理結束后停止編譯過程。
- 選項“-o”是指目標文件,“.i”文件為已經過預處理的C原始程序。
- 預處理過后仍是C語言
- 在這個階段中,gcc 首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后,gcc 把代碼翻譯成匯編語言。
- 用戶可以使用“-S”選項來進行查看,該選項只進行編譯而不進行匯編,生成匯編代碼。
- 實例: gcc –S hello.i –o hello.s
- 匯編階段是把編譯階段生成的“.s”文件轉成目標文件
- 讀者在此可使用選項“-c”就可看到匯編代碼已轉化為“.o”的二進制目標代碼了
- 實例: gcc –c hello.s –o hello.o
- 在成功編譯之后,就進入了鏈接階段。
- 實例: gcc hello.o –o hello
- 分為動態鏈接和靜態鏈接
- 動態鏈接要動態庫
- 動態鏈接:將庫中我要的方法的地址,填入我的可執行程序中,建立關聯!
- 靜態鏈接要靜態庫
- 靜態鏈接:將庫中方法的實現,真的拷貝到我們的可執行程序中
?在這里涉及到一個重要的概念:函數庫
- 我們的C程序中,并沒有定義“printf”的函數實現,且在預編譯中包含的“stdio.h”中也只有該函數的聲明,而沒有定義函數的實現,那么,是在哪里實“printf”函數的呢?
- 最后的答案是:系統把這些函數實現都被做到名為 libc.so.6 的庫文件中去了,在沒有特別指定時,gcc 會到系統默認的搜索路徑“/usr/lib”下進行查找,也就是鏈接到 libc.so.6 庫函數中去,這樣就能實現函數“printf”了,而這也就是鏈接的作用
- 靜態庫是指編譯鏈接時,把庫文件的代碼全部加入到可執行文件中,因此生成的文件比較大,但在運行時也就不再需要庫文件了。其后綴名一般為“.a”
- 動態庫與之相反,在編譯鏈接時并沒有把庫文件的代碼加入到可執行文件中,而是在程序執行時由運行時鏈接文件加載庫,這樣可以節省系統的開銷。動態庫一般后綴名為“.so”,如前面所述的 libc.so.6 就是動態庫。gcc 在編譯時默認使用動態庫。完成了鏈接之后,gcc 就可以生成可執行文件,如下所示。 gcchello.o –o hello
- gcc默認生成的二進制程序,是動態鏈接的,這點可以通過 file 命令驗證。 ??
- -E 只激活預處理,這個不生成文件,你需要把它重定向到一個輸出文件里面
- -S?編譯到匯編語言不進行匯編和鏈接
- -c? 編譯到目標代碼
- -o 文件輸出到 文件
- -static 此選項對生成的文件采用靜態鏈接
- -g?生成調試信息。GNU 調試器可利用該信息。
- -shared?此選項將盡量使用動態庫,所以生成文件比較小,但是需要系統由動態庫.
- -O0
- -O1
- -O2
- -O3 編譯器的優化選項的4個級別,-O0表示沒有優化,-O1為缺省值,-O3優化級別最高
- -w? 不生成任何警告信息。
- -Wall 生成所有警告信息。
Linux調試器-gdb使用
1. 背景
- 程序的發布方式有兩種,debug模式和release模式
- Linux gcc/g++出來的二進制程序,默認是release模式
- 要使用gdb調試,必須在源代碼生成二進制程序的時候, 加上 -g 選項
- [hp@VM-4-9-centos lesson7]$ readelf -S mytest| grep -i debug[27] .debug_aranges PROGBITS 0000000000000000 00001061[28] .debug_info PROGBITS 0000000000000000 00001091[29] .debug_abbrev PROGBITS 0000000000000000 00001189[30] .debug_line PROGBITS 0000000000000000 00001214[31] .debug_str PROGBITS 0000000000000000 0000126a
readelf 讀取其中文件
2. 開始使用
gdb binFile 退出: ctrl + d 或 quit 調試命令:- list/l 行號:顯示binFile源代碼,接著上次的位置往下列,每次列10行。
- list/l 函數名:列出某個函數的源代碼。
- gdb會記錄最近一次指令,按回車可繼續執行上次指令
- r或run:開始調試,如果沒有斷點則直接運行
- n 或 next:單條執行。
- s或step:進入函數調用
- break(b) +行號:在某一行設置斷點
- break?函數名:在某個函數開頭設置斷點
- info break :查看斷點信息。
- fifinish:執行到當前函數返回,然后挺下來等待命令
- print(p):打印表達式的值,通過表達式可以修改變量的值或者調用函數???????
- p 變量:打印變量值。
- set?var:修改變量的值
- continue(或c):從當前位置開始連續而非單步執行程序
- run(或r):從開始連續而非單步執行程序
- delete?breakpoints:刪除所有斷點
- delete?breakpoints?n:刪除序號為n的斷點
- disable?breakpoints +斷點編號:禁用斷點
- enable?breakpoints:啟用斷點
- info(或i)?breakpoints:參看當前設置了哪些斷點
- display?變量名:跟蹤查看一個變量,每次停下來都顯示它的值
- undisplay:取消對先前設置的那些變量的跟蹤
- until X行號:跳至X行
- breaktrace(或bt):查看各級函數調用及參數
- info(i)?locals:查看當前棧幀局部變量的值
- quit:退出gdb
3.獲取程序運行中的PID和PPID
while :; do ps ajx | head -1 && ps axj | grep myproc | grep -v grep; sleep 1; echo "--------------------------------------------------"; done?
Linux項目自動化構建工具-make/Makefifile
背景
- 會不會寫makefifile,從一個側面說明了一個人是否具備完成大型工程的能力
- 一個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中,makefifile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復雜的功能操作
- makefifile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。
- make是一個命令工具,是一個解釋makefifile中指令的命令工具,一般來說,大多數的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make??梢?#xff0c;makefifile都成為了一種在工程方面的編譯方法。
- make是一條命令,makefifile是一個文件,兩個搭配使用,完成項目自動化構建。
理解
依賴例子實例代碼
C代碼 1 #include <stdio.h> 2 int main() 3 { 4 printf("hello Makefile!\n"); 5 return 0; 6 7 } Makefifile文件 hello:hello.o gcc hello.o -o hello hello.o:hello.s gcc -c hello.s -o hello.o hello.s:hello.i gcc -S hello.i -o hello.s hello.i:hello.c gcc -E hello.c -o hello.i ???????? .PHONY:cleanclean:rm -f hello.i hello.s hello.o hello依賴關系
- 上面的文件 hello ,它依賴 hell.o
- hello.o , 它依賴 hello.s
- hello.s , 它依賴 hello.i
- hello.i , 它依賴 hello.c
依賴方法
- gcc hello.* -option hello.* ,就是與之對應的依賴關系
原理
- make是如何工作的,在默認的方式下,也就是我們只輸入make命令。那么,
項目清理
???????- 工程是需要被清理的
- 像clean這種,沒有被第一個目標文件直接或間接關聯,那么它后面所定義的命令將不會被自動執行,不過,我們可以顯示要make執行。即命令——“make clean”,以此來清除所有的目標文件,以便重編譯。
- 但是一般我們這種clean的目標文件,我們將它設置為偽目標,用 .PHONY 修飾,偽目標的特性是,總是被執行的。
- 可以將我們的 hello 目標文件聲明成偽目標,測試一下
???????Linux第一個小程序-進度條
\r&&\n
回車概念: ????????當光標鎖定到任意位置時,采用回車光標將自動回到開頭處 換行概念:???????? 當光標鎖定某一位置,采取換行操作光標將平移到下面一行行緩沖區概念
1 #include<stdio.h>2 #include<string.h>3 #include<unistd.h>4 5 #define NUM 1026 int main()7 {8 char bar[NUM];9 memset(bar,0,sizeof(bar));10 int cnt=0;11 while(cnt<=100)12 {13 printf("[%-100s][%d%%]\r",bar,cnt);14 bar[cnt++]='#';15 fflush(stdout);16 usleep(30000); 17 }18 printf("\n");19 return 0;20 }yum?
使用 git 命令行
安裝 git
yum install git
下載項目到本地
創建好一個放置代碼的目錄. git clone [url] 這里的 url 就是剛剛建立好的 項目 的鏈接.?三板斧第一招: git add
將代碼放到剛才下載好的目錄中 git add [文件名] 將需要用 git 管理的文件告知 git 三板斧第二招: git commit 提交改動到本地 git commit . 最后的 "." 表示當前目錄 提交的時候應該注明提交日志, 描述改動的詳細內容. 三板斧第三招: git push 同步到遠端服務器上 git push 需要填入用戶名密碼. 同步成功后, 刷新 Github 頁面就能看到代碼改動了.其他情況:
總結
- 上一篇: NLP-信息抽取-关系抽取-2016:A
- 下一篇: 单片机8位抢答器实训机电报告_6位抢答器