前段linux學習的小結,分享一下:)。
一、Linux C語言編程環境搭建
需要以下軟件包
² gcc:編譯器。
² cpp:源代碼預處理
² libgcc:gcc必須的自身組件
² libc6:提供C語言運行所需的庫文件和庫文件操作命令
² binutils:提供輔助工具
/usr/bin/size:顯示每個目標文件或歸檔文件的章節大小和總的大小
/usr/bin/ar:歸檔文件管理工具,可以創建、修改或打開一個歸檔文件
/usr/bin/objdump:顯示目標文件的信息
/usr/bin/strings:顯示一個文件中的可打印字符串
/usr/bin/ranlib:產生歸檔文件的索引
/usr/bin/objcopy:複製或轉換目標文件
/usr/bin/addr2line:把一個地址信息轉換爲文件名和行號
/usr/bin/readelf:顯示 ELF 文件信息, ELF 文件格式即 Linux 目前流行的可執行文件格式
/usr/bin/nm:顯示目標文件裏的符號
/usr/bin/strip:去除目標文件裏的符號
/usr/bin/as:GNU 彙編工具
/usr/bin/ld:GNU 鏈接工具
/usr/bin/gprof:顯示目標文件的profile數據
² locals:提供本地語言環境支持
² libc6-dev:提供c語言庫libc、頭文件
² manpages-dev:提供man手冊
² make:維護源代碼
² gdb :調試程序
² indent:格式化源代碼
注:如有需要還可以安裝以下軟件包,以提供參考手冊
² glibc-doc-reference
² glibc-doc
² make-doc
二、選擇文件編輯工具
如果linux爲文本界面,通常有以下幾種選擇:
1.使用linux提供的VI編輯器
常用命令:
vi filename:打開或新建一個文件
←→:光標左右移動
↑↓:光標上移/下移一行
i:在光標前插入文本
I:在當前行首插入文本
r:替換當前文本
R:替換當前字符以及其後的字符,至到按ESC
do:刪至行首
d$:刪至行尾
ndd:刪除當前行及其後n-1行,刪除1行的時候可以省略爲dd
/pattern:從光標開始處向文件尾搜索pattern
?pattern:從光標開始處向文件首搜索pattern
n:在同一方向上重複上一次搜索命令
N:在相反方向上重複上一次搜索命令
g/p1/s//p2/g:將文件中所有p1替換爲p2
最後行方式命令(處於其他模式的場合,按ESC後纔可鍵入命令):
:q!:退出且不保存變更
:q:退出,如果有變更,會給出提示
:w:保存當前文件
:x:保存變更並退出
2. 在windows側編輯文件,通過FTP工具上傳到Linux機器。
3. 使用UltraEdit連接到linux上,把文件直接保存到Linux機器上
新建文件:
File->New新建一個文件
->File->FTP->Save As to FTP
->Accounts
->New 沒有linux FTP acconut的場合,創建一個
->在Account下拉框中,選擇使用的FTP account
->選擇文件保存目錄,最好一個程序一個目錄
->選擇傳輸類型:二進制方式
->輸入文件名
->點擊Save As,保存文件
打開一個既存文件:
File->FTP->Open From FTP
->在Account下拉框中,選擇使用的FTP account
->選擇文件目錄
->選擇傳輸類型:二進制方式
->雙擊選擇的文件或點擊Open
文件保存:
和一般文件相同。ctrl+s或點擊保存按鈕。
爲了方便,新建一個工具欄,把Save AS To FTP、Open From FTP等添加到工具欄中。
三、程序文件作成
1.創建一個文件夾,用於存放程序文件和make文件。(便於管理)
2.作成頭文件(.h文件,用於存放引用的頭文件、宏定義、結構體定義、函數原型等)
注:最後一行空白
3.作成.c文件(程序實現)
注意:linux c的某些函數和windows不同。
最後一行空白
4.根據文件的依賴關係作成make文件Makefile。
⑴變量定義
通常會定義以下變量:
² CC=gcc 編譯器選擇
² SRC=a.c b.c 指定依賴的.c文件
² OBJ = $(SRC:.c=.o) 或OBJ=a.o b.o
指定依賴的object文件。$(SRC:.c=.o)是將所有SRC中的.c文件轉換爲對應的.o文件。
² HDR=a.h b.h 指定依賴的頭文件
² INCDIR=-Idir11 -Idir2 指定頭文件搜索目錄
² LIBDIR=-Ldir1 -Ldir2 指定鏈接庫搜索目錄
² LIBR=-la -lb 引用庫a, b
² CFLAGS= -g –Wall -O -Dmacro1 gcc選項:打開調試選項、輸出所有警告信息、進行優化、定義宏macro1
² BIN=filename 指定最終輸出物件的名字
⑵依賴關係
² 生成動態庫的場合
all:依賴的Object文件$(OBJ) 最終生成物件$(LIB)
依賴的Object文件$(OBJ):源代碼$(SRC):頭文件$(HDR)
$(CC) -fPIC $(CFLAG) -c $(SRC)
最終生成物件$(LIB):源代碼$(SRC) 依賴的Object文件$(OBJ)
$(CC) -shared $(CFLAGS) $(INCDIR) $(LIBDIR) –o$@ $(OBJ) $(LIBR)
² 生成靜態庫的場合
all:依賴的Object文件$(OBJ) 最終生成物件$(LIB)
依賴的Object文件$(OBJ): 源代碼$(SRC):頭文件$(HDR)
$(CC) $(CFLAG) $(INCDIR) -c $(SRC)
最終生成物件$(LIB): 源代碼$(SRC):依賴的Object文件$(OBJ)
$(AR) r $@ $(OBJ)
注:AR=ar
² 生成可執行物件的場合
all:最終生成物件$(BIN)
最終生成物件$(BIN):源文件($SRC) 頭文件($HDR)
$(CC) $(CFLAGS) $(INCDIR) $(LIBDIR) -o $@ $(SRC) $(LIBR)
⑶目標文件清空
在Makefile的最後,加入清空目標文件的規則
clean:
rm –f $(BIN) $(OBJ) 或 rm –f $(BIN) *.o
或者
.PHONY:clean
clean:
-rm -f $(BIN) $(OBJ) 或 -rm -f $(BIN) *.o
注:.PHONY顯式的把clean聲明爲一個“僞目標”,是爲了避免同一目錄下存在一個名爲clean的文件的場合下,make clean執行錯誤。
rm前加”-”:命令執行過程中某個文件出錯的場合,繼續執行
四、代碼編譯
1.執行make命令,編譯代碼。
爲了方便查看輸出信息,在make 後追加 &>filename,把標準輸出和錯誤輸出都寫到指定文件中。如:make &>result
2.修改編譯錯誤和警告,再次編譯,直到編譯通過。
錯誤定位的一些技巧
² 越是低級錯誤,影響範圍越大。檢查第一個錯誤之前的行是否以分號結尾,小括號、中括號、大括號是否匹配等。錯誤找到,修改後,立即重編代碼。這下錯誤少了很多呢,心情是不是也跟着好起來了呢。
² 引用了未定義的系統函數:首先man一下,如果找到對應的手冊,則可能是頭文件沒有引用或引用錯誤;如果沒有找,則可能是Linux側的函數名和windows側的不同。
² 系統函數鏈接錯誤,Makefile gcc命令選項中是否指定了對應鏈接的庫
五、程序執行
1.執行物件
直接在命令行執行生成物件,查看輸出結果是否正確
命令:
./filename
文件絕對路徑
2.動態庫或靜態庫
作成可執行物件調用庫函數,然後執行可執行物件
六、程序調試
1.一般可執行物件
gdb filename 啓動gdb並載入程序
2.進程
² gdb -p 進程ID 或 gdb attach 進程ID
啓動gdb並載入進程
² (gdb) set follow-fork-mode [parent | child]
設定fork之後繼續調試父進程還是子進程
² (gdb) set detach-on-fork [ on | off]
指示gdb在fork之後是否斷開(detach)某個進程的調試,或者都交由GDB控制
on: 斷開調試follow-fork-mode指定的進程
off: gdb將控制子進程和父進程,follow-fork-mode指定的進程將被調試,另一個進程處於暫停(suspended)狀態。
注:該命令是在gdb 6.6(包括)以後支持的
3.常用gdb調試命令
² list列出產生執行文件的源代碼的一部分(10L)
list function列出某個函數
list 接着前一次繼續顯示
list linenumber 從行linemuber開始顯示10L
² break 在代碼裏設置斷點
break function 在函數入口設置斷點
break linenumer 在當前源文件的行linenumber處設置斷點
break file:linenmuber 在指定源文件file的linenumber行處設置斷點
² next 執行一行代碼,而不進入函數內部
² step 執行一行代碼,並進入函數內部
² info 查看程序信息
info br 查看斷點信息
² continue 繼續執行,直到遇到下一個斷點
² print 查看變量值,格式: print [/F] 參數 F爲輸出格式
常用格式:
x 16進制整數格式
d 有符號十進制整數格式
u 無符號十進制整數格式
f 浮點數格式
² set 修改變量的值,格式set 參數=值
² clear 刪除一個斷點,以函數名或行號作爲參數
² disable 禁止某個斷點,參數是斷點在斷點列表中的索引,使用info br可以看到
² enable 允許某個斷點功能,參數同disable
² quit 終止 gdb
~完~