網站首頁 編程語言 正文
1:make和Makefile的介紹:
概念
在軟件的工程中的源文件是不計其數的,其按照類型,功能,模塊分別放在若干個目錄中,哪些文件需要編譯,那些文件需要后編譯,那些文件需要重新編譯,甚至進行 更復雜的功能操作,這就引入了我們的系統編譯的工具:
在linux和unix中,有一個強大的使用程序,叫make,可以用它來管理多模塊程序的編譯和鏈接,直至生成可執行文件
make使用程序讀取一個說明文件,稱為Makefile,Makefile文件中描述了整個軟件工程的 編譯規則和各個文件之間的依賴關系;
Makefile就像是一個Shell腳本一樣,其中可以執行操作系統的命令,它帶來的好處就是我們能夠實現“自動化編譯”,一旦寫好,只要一個make命令,整個軟件功能就完全自動編譯,極大的提高了軟件開發的效率;
make是一個命令工具,是一個解釋Makefile中指令的命令工具,一般來說大多數IDE都有這個命令
使用make可以是重新編譯的次數達到最小化;
2:make和Makefile
1:make的使用語法:
make使用語法: ? ? make [選項][目標][宏定義] ? ? 選項列表: ? ? ? ? -d ?顯示調試信息(debug) ? ? ? ? -f<文件> 指定從那個文件中讀取以來關系,默認文件是"Makefile"或者"makefile","-"表示從標準輸入(file) ? ? ? ? -h ?顯示所有選項的簡要說明(help) ? ? ? ? -n 不運行任何Makefile命令,只去現實它們(no) ? ? ? ? -s 安靜的方式運行,不顯示任何信息(silence) ? ? 可以使用-h來獲取更多的選項:
2:Makefile的編寫原則和規則
當make命令不帶選項運行的時候,它從Makefile中讀取指定規則 當制定規則不同與Makefile(makefile)的其他文件中時候,就要運行帶有-f選項的make命令。如make.fray.Makefile make -f make.fray.Makefile
Makefile的編寫規則一:
目標列表:關聯性列表 <TAB>命令列表 目標列表:是用一個或者多個空格分開的目標文件的清單 關聯性列表:同樣是一個或者多個空格分開的目標文件,是目標列表所以來的多個目標文件的清單; 命令列表:用于創建目標文件的將要執行的命令清單,這個命令列表被換行符號分開,命令列表中的每個命令必須要以<TAB>字符開始; 如:##Sample power:power.c gcc -o power power.c 如:#Sample power:power.o demo.o gcc -o power power.o demo.o power.o:power.c gcc -o power.o -c power.c demo.o:demo.c gcc -o demo.o -c demo.c 注意:書寫的形式類似于倒推的形式
Makefile的編寫規則二:(不建議使用)
目標列表:關聯性列表;命令列表 命令列表是一系列被分號隔開的命令,一個很長的命令行要續行的時候需要用一個反斜杠符號 如:all/mymath_test:src/mymath.c src/mymath_test.c; \ gcc -o all/mymath_test src/mymath.c \ src/mymath_test.c
注意:makefile書寫主要注意的是:
- 1:編譯規則
- 2:依賴關系
- 3:倒推原理
- 4:使用make命令去執行
- 5:如果已經是最新的文件的時候,就不會再去編譯執行了
- 6:make去讀取makefile的時候,是按照依賴文件的順序去查找并且執行命令的
- 7:make在編譯的時候,如果發現被編譯的文件已經是最新的了,就不會再去編譯(減少了編譯次數)
- 8:make文件是根據被編譯文件的時間戳去判斷文件是否是當前最新的文件,如果是最新的,那么就會去重新編譯,如果不是最新的,就不會去進行編譯;
- 9:千萬要注意makefile中編譯命令前面的分隔符
Makefile變量的使用
簡單變量: 定義 變量名字:=[文本] 這類變量的實質就是一組字符串 添加 變量名字+=[文本]或者 變量名字:=[文本][文本] 引用變量 $(變量名) $單字符變量(指的是但字符的變量 a:=123 $a) 如:G:=gcc 一般我們都是定義成大寫的 $G -o power power.c 內置變量: $@ 當前目標的名詞 $? 比當前目標更新的已修改的依賴性列表 $< 依賴性列表的第一個文件 $^ 用空格分開的所有依賴性列表
虛目標
虛目標是不存在的文件 虛目標允許你去強制執行某些事件,但這些事件在正常的規則中是不會發生的 虛目標不是真正的文件,make命令可以使用針對他們的任意規則 虛目標總是使與之有關的命令被執行 all 生成工程中所有可以執行者,通常是makefile的第一個生成目標 test 運行程序的自動測試套件 clean 刪除make all生成的所有文件 install 在系統目錄中安裝工程項目生成的可執行文件和文檔 uninstall 刪除make install安裝的所有文件
特殊目標
make中有一些與定義的目標,這些預定義目標被make以一種特殊的方式進行處理,這些目標稱為特殊目標; .DEFAULTS 如果make找不到生成目標的任何makefile入口或后綴規則,就執行與目標相關的命令 .IGNORE 如果某一行makefile包含該目標,make忽略錯誤代碼并繼續建立,如果一個命令不正常存在,make自然會停止,帶有-i選項的make命令可以執行相同的任務 .PHONY 允許你指定一個不是文件的目標,所以您能只是make調用一系列makefile中的命令,即使在當前目錄中有一個具有相同名字的文件 .SILENT make執行這些命令,但是不顯示這些命令,帶有-s的make可以執行相同的人物, .SUFFIXES 為目標指定的前提(后綴)可以與后綴規則相互關聯,如果與目標沒有相關性的前提,以存在的后綴列表就會被刪除
默認模式規則
make中有許多預定義的規則成為后綴規則,它可以讓make自動執行許多任務 為了建立一個目標,make會遍歷一連串的依賴關系,這是為了決定從何處開始建立,如果沒有找到目標文件,make就按有限順序查找源文件 默認模式規則: %o:%c $(CC) $(CFLAGS) -c $< $o:%s $(CC) $(AFLAGS) -o $@ $<
Makefile中的相關通配符:
#:注釋 \:連接符號 關聯列表和命令列表中可以使用shell通配符號? * %等
附上一個簡單的makefile
#Sample CC:=gcc CFLAGS:=-Iinclude CFLAGS+=-c TARGET:=all/mytest_test3 DEPEND:=obj/mymath.o DEPEND+=obj/mymath_test.o $(TARGET):$(DEPEND) $(CC) -o $@ $^ #obj/mymath.o:src/mymath.c # $(CC) -o $@ $(CFLAGS) $^ #obj/mymath_test.o:src/mymath_test.c # $(CC) -o $@ $(CFLAGS) $^ #使用make中的默認的模式規則 obj/%.o:src/%.c $(CC) -o $@ $(CFLAGS) $^ #聲明clean是一個虛目標 .PHONY:clean clean: rm -rf obj/mymath.o obj/mymath_test.o
原文鏈接:https://blog.csdn.net/qq_29924041/article/details/55224446
相關推薦
- 2022-06-19 GO語言對數組切片去重的實現_Golang
- 2022-03-30 SQL基礎查詢和LINQ集成化查詢_MsSql
- 2022-10-11 RabbitMQ:生產者消息確認、消息持久化、消費者消息確認、消費失敗重試機制
- 2022-09-30 在ubuntu下安裝go開發環境的全過程_Golang
- 2023-03-16 python使用redis實現消息隊列(異步)的實現完整例程_python
- 2022-04-16 pycharm如何為函數插入文檔注釋_python
- 2022-11-02 Qt5.14.2使用虛擬鍵盤的關鍵代碼_C 語言
- 2022-05-24 Go中的新增對模糊測試的支持_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支