
個人主頁:在線OJ的阿川
大佬的支持和鼓勵,將是我成長路上最大的動力
阿川水平有限,如有錯誤,歡迎大佬指正
Linux一系列的文章(質量分均在93分 以上)
Linux–發展、環境、指令上半場
Linux–指令下半場
Linux–權限
Linux–生態與工具
Linux–開發工具
這是目錄
- 眾所周知
- Makefile第一性原則
- 簡寫操作
- 隱藏展示依賴方法
- 深入了解
- 時間問題
眾所周知
自動化構建工具是指
- make 指令
- 能夠自動化 編譯和自動化清除文件
- makefile 文件
- 文件中存在依賴關系和依賴方法
Makefile第一性原則
所以單個make指令 表示編譯嗎?
不一定,在make中它會默認 makefile文件中的第1個依賴關系為具體實現
簡寫操作
寫依賴方法的文件名很麻煩,可不可以簡寫呢?
輸入
$ @ 表示簡寫依賴方法冒號的左邊文件
$ ^ 表示簡寫依賴方法冒號的右邊文件
即 $ 鎖定為依賴方法的冒號,@表示左邊, ^ 表示右邊
隱藏展示依賴方法
每次使用 自動化構建工具,都會展示 具體的依賴方法,若我不想 讓它展示呢?
在依賴方法中加入@
深入了解
我們將深入一下,自動化構建工具是如何進行工作的?
makefile它有自己的一套依賴關系棧式結構
且在makefile中它會自動幫你保存所寫內容
時間問題
make常常用于編譯,那我可以一直make,一直重新編譯嗎?
不能的,make指令它會根據源文件和目標文件的新舊 ,判斷是否需要重新執行依賴關系進行編譯.
翻譯成大白話:
已經編譯過的文件,之后編譯器會自動識別 是否編譯過
若編譯過了就不再編譯了,因為可以節省效率,無需重新編譯。
那編譯器是如何做出判斷的呢?
看可執行程序和源文件時間 :
若可執行程序時間大于源文件時間,則無需重新編譯。
若可執行程序時間小于源文件時間,則需重新編譯。
深入一點?
源文件和可執行程序新舊問題的判斷,編譯器會將源文件和可執行程序時間轉換成時間戳,根據大小來進行比較新舊。
哦,就是時間呢?那很簡單呀
不一定
時間分為:
- Access 訪問的時間
- Modify 修改的時間
- Change 改變的時間
簡稱為ACM:A(訪問)C(改變)M(修改)
修改的時間和改變的時間不是一樣的嗎?
不是哦,舉個例子
文件等于文件內容(modify)加文檔屬性(change)
之前說了Linux當中,一個重要的思想就是一切皆文件
所以
modify是文件內容修改的時間
change是文檔屬性修改的時間
則文件內容修改,一定會引起文檔屬性的改變,則時間也會引起改變
即modif時間改變會影響change時間改變,但 change不一定影響modify改變
例如文檔屬性可能重命名一下,但不會文檔內容改變。
如何進行查看時間呢?
用stat指令可以查看可執行文件和源文件的時間
深入一下?
這里發現access訪問的時間并沒有發生變化,這不對呀
access訪問時間應該是更改的是最頻繁的,為什么反而沒有變化呢?
正是因為
Access訪問是最頻繁的,要反復寫入硬盤中
若多個用戶使用則效率太低了
在如今版本中設置者修改了一下,現在需要根據 modeify和change的頻率來進行更改Access的記錄時間或者要三四次access訪問時間才能記錄為一次有效的時間
這樣做從而間接的提高了效率
若不想進行優化,就想全部更新時間或者指定單獨的時間進行更新,可以嗎?
touch 更新已有的文件
- -m對 modify單獨進行更新
-
若該文件未存在,則會新建文件
-
若已存在,則會將時間全部進行更新。
-
注意:當時間全部進行更新后即make可以重新進行編譯.
這樣好麻煩呀,能不能找個一勞永逸的方法就讓它重新自動化構建,而不是一直用touch進行更新時間?
可以的
在makefile下輸入偽目標.PHONY
- 告訴編輯器總是放它通行
但是不建議將偽目標放入編譯實現中,而常常將偽目標放入清理實現中來
因為就算將偽目標放入編譯中,編譯器總是放它通行即重新編譯
但該重新編譯是在可執行程序上新增內容編譯,這可能導致老的問題依舊還有。
所以常常將偽目標放入清理實踐中
因為當清洗了數據之后 再重新編譯
即完全先刪除可執行程序, 再重新創建重新編譯可以有效避免老的問題。
好的,到此為止啦,祝您變得更強
想說的話
實不相瞞,寫的每篇博客都要寫五六個小時(加上自己學習和紙質筆記,共八九小時吧),很累,希望大佬支持下吧
道阻且長 行則將至 |
---|
個人主頁:在線OJ的阿川大佬的支持和鼓勵,將是我成長路上最大的動力