目錄
一:自動化構建工具make/makefile?
? ? ?生成內容:
? ? ?清理內容:
? ? ?對于多過程的:
? 對于多次make:
特殊符號:?
二:小程序之進度條?
三:git的簡單介紹?
四:Linux調試器gdb
接下來的日子會順順利利,萬事勝意,生活明朗-----------林辭憂
一:自動化構建工具make/makefile?
1.make是一個指令,makefile是當前目錄下的文件,兩個搭配使用完成項目的自動化構建
2.makefile的工作原理
? ? ?生成內容:
對于make在編譯的時候,會首先在當前目錄下查找對應的makefile文件,再在makefile文件當中根據依賴關系和依賴方法,執行依賴方法中的內容,編譯形成對應的目標文件(上面的例子中為test可執行文件)?
? ? ?清理內容:
這里就會發現,在清理時的指令為make clean,但在創建時只需要make就行,這是因為
make會自頂向下掃描makefile,把要形成的第一個目標文件充當make的默認動作,形成的第一個目標文件,所以誰在前,make就會先直接生成誰
所以對于其他的操作,make必須指定的去操作?
形式如: make 對應的目標文件?? ? 指定名稱地執行該依賴關系與匹配的依賴方法?
? ? ?對于多過程的:
會發現在執行時的和在makefile中的順序是不同的,這是因為
make在掃描makefile文件時,會優先根據依賴關系,查找依賴關系中所依賴的文件列表是否在當前目錄已經存在 ,如不存在,makefile會類似于遞歸式的去形成依賴文件,在依賴文件當中根據依賴關系和依賴方法形成對應的依賴文件,然后統一根據依賴文件形成目標文件,所以簡單地說就是make會自動推導makefile中的依賴關系,這是一種棧式的結構
? 對于多次make:
1.可以看出對于多次執行的操作是不允許的,這是因為這樣做的好處的是可以提高編譯效率,避免? ? ?重復的操作
2.但這是如何做到的 ,這就得引出下面的內容了
首先一定是源文件形成可執行文件,所以一般而言源文件的最近修改時間是老于可執行文件的最近修改時間;但如果我們修改了源文件,歷史上還有可執行文件的話,那么源文件的最近修改時間是一定要新于可執行文件的最近修改時間的
這樣的話,就只需要比較可執行文件的最近修改時間和源文件的最近修改時間,便能做到是否允許重新編譯
? ? ? 如果源文件的最近修改時間老于可執行文件的,不需要重新編譯
? ? ??如果源文件的最近修改時間新于可執行文件的,需要重新編譯
一般而言這兩個文件的最近修改時間是不會相同的
3.stat指令 查看源文件/可執行文件的時間
使用: stat 文件名
Access是最近訪問時間? ? ?
Modify是最近修改文件內容的時間(關鍵時間)? ? ?
Change是最近修改文件屬性的時間
修改三個時間
touch -a 已經存在的文件? 修改文件的Access時間
touch -m 已經存在的文件? 修改文件的Modify時間(修改的同時Change時間也會改變)?
chmod? 修改文件的Change時間(Modify時間不一定改變)
touch 文件名? 修改三個時間(如果文件已經存在,則修改時間,反之是創建文件的操作)
但特殊的對于Access時間不使用touch -a 的話,他的更新策略則是根據Modify和Change的更新次數,還有最近更新的文件被訪問的計數器統計的次數來決定是否更新
所以對于make是會根據源文件和目標文件的新舊,判定是否需要重新執行依賴關系進行編譯,因此依賴關系是不一定總被執行的,但如果想要依賴關系總是被執行,就需要添加.PHONY來修飾
特殊符號:?
二:小程序之進度條?
1.回車與換行
回車是\r,換行是\n兩者是不相同的,回車是回到行的開始處,換行則是到下一行
2.緩沖區
對于這段代碼在執行時,總是休眠兩秒后再打印出結果,那么在sleep的期間,"hello Linux"這段代碼是存放在哪的?但肯定的是一定是被保存起來了,這就存放在由c語言維護的一段內存空間,即緩沖區
如果代碼中有\n的話,就會立即刷新出來,沒有的話就只能等緩沖區滿或者代碼執行完結束,因為顯示器模式是行刷新
那么如果要在執行完printf后立即將結果刷新出來,可以使用fflush(stdout) 將結果強制刷新出來
這里可以實現一個倒計時
3.進度條的實現
?processbar.c
processbar.h
?
main.c
?
三:git的簡單介紹?
git是一個具有網絡功能的開源的版本控制器,集客戶端與服務端于一體
安裝git yum install git
將遠程倉庫克隆到本地? git clone 遠程倉庫的網址
git三板斧:(進入倉庫文件中進行操作)
?git add .? ?(將倉庫下沒有上傳的文件進行上傳)
git commit -m "日志"
git push +建立倉庫時的密碼
其他的注意:
.git 為本地倉庫(ls -al 查看)
git --version 查看版本
git log 查看日志
git status 查看提交狀態
四:Linux調試器gdb
1.在Linux默認編譯生成的可執行程序時release版本的,無調試信息,要想生成debug版本的話,在gcc編譯時加? ?-g選項? 生成debug 版本
可以用gdb 可執行程序? ? ? ? ? ?驗證默認生成的為debug/release 版本,也可以進入gdb開始調試
常用操作:
q? ?退出
r? 執行代碼
b 行號/文件名:行號/函數名/文件名:函數名? ? 對應位置設置斷點信息
info b? ?查看斷點信息
d 斷點的編號(NUM)? ? 刪除斷點
n? ?逐過程執行
s? ? 逐語句執行
l 數字/函數名? ? ?查看gdb代碼,默認顯示十行,可多次回車即可顯示全部(gdb會默認記錄上一條命令)
p 變量名? ?查看變量的值(相當于監視窗口)
display 變量? ?每次執行都打印變量的值(常顯示)
undisplay? 變量最左邊的編號? ? ?取消常顯示
until 指定行號? ? 程序跳轉執行到指定行
先s進入調用函數內部,再finish? ? ? ? ?執行完整個調用函數就停下來
c? ? 從斷點1執行到斷點2
disable 斷點編號? ? ? ?停用斷點
enable 斷點編號? ? ? ? ? 啟用斷點
set var 變量名=值? ? 修改變量的值
bt 查看調用堆棧
info locals? ?查看當前函數中的定義的局部變量