linux下的c编程
vi編譯器簡介
vi的三種模式,分別為命令行模式,插入模式以及底行模式,這里游客去看,這里提供好幾個小技巧:G表示移動到文件末尾nG表示移動到第幾行
gcc優化選項
gcc可以對代碼進行優化,他可以通過編譯選項“-On”來控制優化代碼的生成,其實你是一個代表優化級別的整數,對于不同的版本的gcc來講,n的取值范圍以及對應的優化效果可能并不完全相同,比較典型的是從0到2或者3
不同的優化級別對應不同的優化處理工作,如使用優化選項-O 主要進行線程跳轉和延遲退棧,使用優化選項-O2除了完成所有的-O1級別的優化之外,同時還進行一些額外的調整工作,比如優化處理器指令調度,選項“-O3”則還包括循環展開和其他一些與處理器相關的優化工作
雖然優化選項可以加速代碼的運行速度,但是,對于調試而言將會是一個很大的挑戰,因為代碼在進行優化之后,原先在源程序中聲明和使用的變量很有可能不在使用,控制流也可能突然跳轉到意外的地方,循環語句也有可能因為循環的展開而變得到處都有,所有的這些優化對調試來講都將是一場噩夢,所以筆者建議在調試的時候最好不適用任何優化選項,只有當程序在最終發行時才考慮對其進行優化
?在gdb中的命令都可以使用縮略形式的命令《保存退出前使用gcc編譯要加上 -g這個參數》
l 代表list
b 代表breakpoint
p代表print?
設置斷點 b 6 //在第六行設置斷點,查看斷點 info b?
程序調試的大致7步
1:查看文件 (l)2:設置斷點(b)3:查看斷點情況(info b)4:運行代碼(r)5:查看變量的值 (p 變量)
6:單步運行(n 和s)7:恢復程序運行(c)
小技巧1:在設置完斷點之后,運行程序,當程序運行到斷點處時用戶可以鍵入backrace ,或者是(bt)可以查找到調用函數(堆棧)的情況,這個功能在程序調試之中使用非常廣泛,經常用于排除錯誤或者監視調用堆棧的情況
?小技巧2:gdb在顯示變量時都會在對應值之前加上“$N”標記,他是當前變量值得應用標記,所以以后若想再次引用此變量就可以直接寫作“$N",而無需寫冗長的變量名
?
小知識:在gdb中,程序的運行狀態有 運行 暫停 和停止 其中 暫停 狀態為程序遇到斷點或者觀察點之類的,函數暫時停止運行,此時函數的地址,函數參數,函數內的局部變量都會被壓入“棧”中。故在這種狀態下可以查看函數的變量值等各種屬性,但是函數處于停止狀態之后,棧就會自動撤銷,他就無法查看各種信息了。
?
make 工程管理器
所謂工程管理器,顧名思義,是用于管理較多的文件,讀者可以試想一下,有成百上千個文件構成的項目,如果其中只有一個或者少數幾個文件進行了修改,按照之前所學的gcc編譯工具,就不得不把這些文件重新編譯一遍,因為編譯器并不知道那些文件是最近更新的,而只知道需要包含這些文件才能把源代碼編譯成可執行文件,于是,程序員就不得不重新輸入數目如此龐大的文件名已完成最后的編譯工作
編譯過程分為編譯 匯編 連接階段,其中編譯階段僅僅是檢查語法錯誤以及函數與變量是否被正確的聲明了,在鏈接階段這主要是完成函數鏈接和全局變量的鏈接,因此,那些沒有改動的源代碼根本不需要重新編譯,而只是要把他們重新鏈接進去就可以了,所以,人們就希望有一個工程管理器能夠自動的識別更新了的文件代碼,而不需要重復輸入冗長的命令行,這樣make工程管理器就用運而生了
實際上,make 工程管理器也是個 自動編譯管理器 這里的自動是指他能夠 根據文件時間戳自動發現更新過的文件而減少編譯的工作量,同時 他通過讀入makefile 文件的內容來執行大量的編譯工作,用戶只需要編寫一次簡單的編譯語句就可以了,他大大提高了實際項目的工作效率,而幾乎所有linux下的項目編程均會涉及它
?makefile基本結構
makefile是make讀入的唯一配置文件,因此要講一下makefile的編寫規則,在一個makefile文件中通常包括如下內容:
1:需要由make 工具創建的目標體,通常是目標文件或者是可執行文件
2:要創建目標體所依賴的文件
3:創建每個目標體需要運行的命令,這一行必須以制表符(tab鍵開頭)
他的格式為
target:denpdency_files
command: /*該行必須以tab鍵開頭*/
例如:有兩個文件分別為hello.c和hello.h ,創建的目標體為hello.c,執行的命令為gcc編譯指令 gcc -c hello.c,那么對應的makefile就可以寫為:
hello.o:hello.c hello.h
gcc -c hello.c -o hello.o
接下來就可以只用make了,使用make的格式為make target 這樣make就會自動讀入
?makefile,并執行target中的command 語句,并未找到相應的依賴文件
?makefile變量
上面示例的makefile在實際中是幾乎不存在的,因為他過于簡單,僅僅包含兩個文件和一個命令,在這種情況完全不需要寫makefile,而只需在shell中直接輸入即可,在實際中使用的makefile往往是包含很多的文件和命令的,這也是makefile出現的原因
下面是一個例子
?
這個makefile中有3個目標體(target),分別是david kang.o yu.o 其中第一個目標體的依賴文件就是后面兩個目標體,如果用戶使用命令make david ?,則make管理器就是找到david目標體開始執行。這時make會自動檢查相關文件的時間戳,首先,在檢查kang.o,yul.o和david 3 個文件的時間戳之前,他會向下查找那些把kang.o或yul.o作為目標文件的時間戳,比如kang.o依賴文件為kang.c kang.h head.h 如果這些文件中任何一個的時間戳比kang.o新,則命令gcc -Wall ?-O -g -c kang.c -o kang.o就會執行,從而更新kang.o,在更新完kang.o或yul.o之后,make會檢查最初的kang.o yul.o和david 3個文件,只要文件kang.o或者yul.o中的至少有一個文件的時間戳比david新,則第二行命令就會被執行,這樣,make就完成了自動檢查時間戳的工作,開始執行編譯工作,這也是make工作的基本流程
?
為了進一步簡化編輯和維護makefile ,make允許在makefile中創建和使用變量,變量是在makefile中定義的名字,用來代替一個文本字符串,該文本字符串成為該變量的值,在具體要求下,這些值可以代替目標體,依賴文件,命令以及makefile文件中的其他部分
?
makefile中的變量的定義有兩種,一種是遞歸展開方式,另一種是簡單方式,
遞歸展開方式定義的變量是在引用該變量是進行替換,即如果該變量包含了對其他變量的引用,則在引用變量時一次性將內嵌的變量全部展開,雖然這種類型的變量能夠很好地完成用戶的指令,但是他也有嚴重的缺點,如 不能在變量后追加內容(因為語句:CRLAGS = $(CFLAGS) -O 在變量擴展過程中可能袋子無窮循環
?
為了避免上述問題,簡單擴展型變量的值在定義處展開,并且只展開一次,因此他不包含任何變來那個對其他變量的引用,從而消除變量的嵌套引用。
遞歸展開方式的定義格式為:VAR = var
簡單擴展方式的定義格式為:VAR:=var
make中的變量均使用的格式為:$(VAR) ?//注意變量名是大小寫敏感的,例如變量名foo FOO Foo代表不同的變量,推薦在makefile內部使用小寫字母作為變量名,預留大寫字母作為控制隱含規則參數或用戶重載命令選項參數的變量名
下面給出了上例中用變量替換修改的makefile 這里用OBJS 代替kang.o和yul.o 用CC代替gcc 用CRLAGS 代替-Wall -O -g 這樣在以后修改時,就可以只修改變量定義,而不需要修改下面的定義實體,從而大大簡化了makefile的維護工作量
?
下文待續~~~
版權所有,轉載請標明鏈接地址http://www.cnblogs.com/fengdashen
轉載于:https://www.cnblogs.com/fengdashen/p/3286575.html
總結
以上是生活随笔為你收集整理的linux下的c编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JUC.Condition学习笔记[附详
- 下一篇: llinux环境变量查看和修改