第三課 Makefile文件的制作(上)

1.序言:

  前面的課程講解了從gcc編譯過程到其實踐,大家可以看到其實在這些步驟中有些是可以簡化編譯的,但由于參數多以及項目中文件數量多的原因難免會造成錯誤甚至是浪費大量的時間在這編譯上,為此linux系統中專門也有這個工具:makefile。

2.原理:

  其實本質Makefile文件(通常開頭是大寫M)就是一個shell文件通過指定的規則來編譯文件。知識點如下:

?

  makefile工具是通過其規則來執行命令,一般其內容分為宏定義以及命令。簡單的宏定義在最后講解下,這先講命令格式:

?

  target ... : prerequisites ...command

  其中target就是目標文件可以是.o文件也可以是可執行文件;

  prerequisites是生成target所需要的依賴文件,可以是代碼文件,也可以是目標文件;

  command就是makefile執行的命令,這里之前忘記了多謝崔好好的提醒,一定是要開Tab鍵開始后輸入,后面回復也有;

  本文就講解一下makefile工具的使用。

3.實踐:

  這節課中使用上節課原有的文件calc.c、calc.h、calcmain.c3個文件(不知道請回看),先清空掉其它文件,,再創建Makefile文件,步驟如下:

  1>創建Makefile文件,并輸入如下內容:

calc:calc.o calcmain.ogcc -Wall calc.o calcmain.o -o calc
calcmain.o:calcmain.cgcc -Wall -c calcmain.c -o calcmain.o
calc.o:calc.cgcc -Wall -c calc.c -o calc.o

.PHONY:clean

clean: rm calc.o calcmain.o calc

  上面代碼其中第一行:

  calc:calc.o calcmain.o:calc為生成的可執行文件對應規則的target;而calc.o calcmain.o是生成calc文件的依賴文件;
         gcc -Wall calc.o calcmain.o -o calc:這就是依賴條件滿足執行的命令;
同理calcmain.o:calcmain.c:calcmain.o這個目標文件要依賴于calcmain.c文件,注明:如果單修改了calcmain.c源文件,那么可用make calcmain.o和make calc命令執行生成此目標文件操作后鏈接生成可執行文件
         gcc -Wall -c calcmain.c -o calcmain.o:生成目標文件;
最后clean是偽目標,通常情況下在其前面加上如下防止當前目錄有相同的指令:
.PHONY:clean

  2>現在這個Makefile文件制作好,直接輸入命令make就可以完成編譯工作:

make

  如果想刪除相關生成的文件執行:

make clean

  如果單修改了calcmain.c源文件,那么單生成calcmain.o文件,在鏈接成可執行文件,執行如下:

make clacmain.o
make calc

  這樣在項目文件多的時候就可以省掉很多時間了!這個命令一敲很爽吧,哈哈。。。。。。

? ? ?3>細心的讀者就可以想到了:竟然Makefile是shell文件,不能用變量來替換其內容多次出現的問題,這個問題真好其實這就是接下來講的部分了。

Makefile文件第一行的calc:calc.o calcmain.o如果把后面的目標文件使用變量的話是不是可以減少維護量啊,如果可執行文件也用變量替換是不是也可以啊,這2個問題現在解決下,新版的Makefile文件如下:
EXE=calc
OBJECTS=calcmain.o calc.o $(EXE):$(OBJECTS)gcc -Wall $^ -o $EXE
calcmain.o:calcmain.cgcc -Wall -c $< -o $@
calc.o:calc.cgcc -Wall -c $< -o $@
clean:rm -f $(EXE) $(OBJECTS)

  這樣使用一些預定義變量如$^就是所有依賴文件;$<就是依賴的第一個文件;$@就是當前的target對象。這樣在文件較多時候就比較好維護了。

這節課就講到這里,還有一些如預定義變量可以自己網上找找看看。

轉載于:https://www.cnblogs.com/luoliang/p/3852348.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277024.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277024.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277024.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

刺猬文│從啟動方式來看播客鏈的運行機制—設置驗證者

&#xff08;圖片出自網絡&#xff0c;版權歸原作者所有&#xff09;上一篇刺猬文我們介紹了播客鏈是如何實現Dpos的&#xff0c;其實質過程就是&#xff1a;節點A打包&#xff0c;將打包的區塊發送給其它的節點&#xff0c;其它節點根據當前時間&#xff0c;判斷是否應該由A節…

[記憶碎片的磁盤整理]老媽

卷標&#xff1a;老媽 掛載點&#xff1a;/family/mother 分區格式&#xff1a;親情 備注&#xff1a;老媽固然是我人生中的至親&#xff0c;但是搜遍我的大鬧&#xff0c;也沒能發現一點關于老媽的特殊記憶。老媽是一位再普通不過的女人、妻子、母親。也本該如此吧。碎片文件&…

探究Java如何實現原子操作(atomic operation)

1. 讓我們首先了解下java 中 Volatile 關鍵字 Volatile可實現java內存模型當中的可見性&#xff0c; java內存模型的可見性&#xff1a; 可見性&#xff0c;是指線程之間的可見性&#xff0c;一個線程修改的狀態對另一個線程是可見的。也就是一個線程修改的結果&#xff0c;另一…

JAVA-重寫equalse規范、技巧

JAVA-重寫equalse規范、技巧 1、自反性 任何非空引用x&#xff0c;x.equalse(x) 應該返回true2、對稱性 任何引用x和y&#xff0c;當x.equals(y)返回true&#xff0c;y.equals(x)也應返回true3、傳遞性 任何引用x、y和z&#xff0c;當x.equalse(y)和y.equalse(z)&#xff0c;那…

Password Creator(HTA)

<!--- 功能&#xff1a; 生成隨機密碼- 輸入&#xff1a; 用戶的設置- 輸出&#xff1a; 隨機密碼&#xff0c;同時拷貝到剪切板- 作者&#xff1a; maskx- 版本&#xff1a; v1.0- 歷史紀錄&#xff1a; 2007-7-11新建 - 創建時間&#xff1a; 200…

Julia 排坑指南

Julia 是一個高效的計算語言&#xff0c;據說性能和C有一拼。 Google也開始支持TPU的Julia&#xff0c; 個人覺得他的可視化比較厲害&#xff0c;下面是自己安裝過程的截圖&#xff0c;由于Julia的服務器在國外&#xff0c;所以下載的過程會出現一些不可描述的問題&#xff0c;…

Arts 第十九周(7/22 ~ 7/28)

ARTS是什么&#xff1f;Algorithm&#xff1a;每周至少做一個leetcode的算法題&#xff1b;Review&#xff1a;閱讀并點評至少一篇英文技術文章&#xff1b;Tip&#xff1a;學習至少一個技術技巧&#xff1b;Share&#xff1a;分享一篇有觀點和思考的技術文章。 Algorithm 深度…

難過的要命。。。。。。

請允許我這樣叫幾下&#xff0c;我知道自己是個老姑娘了&#xff0c;不能像小女孩那樣碰到點不開心的事就一哭二鬧三上吊。我不哭不鬧更不會傻得去上吊&#xff0c;我還有幾十年的大好日子要過呢&#xff0c;我兒子還沒生呢。現在我們還沒有正式的攤牌&#xff0c;應該說只差最…

基于.NET2.0的System.Net.Mail發送郵件Demo

第一種: //emailaddress郵件接收者地址 //mailcontent郵件主體內容 //mailtitle郵件標題 //mailsubject郵件主題 public bool SendMail(string emailaddress,string mailcontent,string mailtitle,string mailsubject) { …

美國美國,USA USA

外派美國微軟接的項目職位名稱&#xff1a;開發主管&#xff08;SDE LEADER&#xff09; 工作城市&#xff1a;Redmond 職位要求: Good English communicationGood SQL and C# .net framework experienceBackend developmentBI knowledge (he is expected to deal with millio…

Windows Server 2016之RDS配置證書

證書我們可以自己創建也可以到阿里云申請&#xff0c;一次申請可以用一年&#xff0c;&#xff08;自己創建的證書是不受信任的&#xff09;所以我們在阿里云上申請的&#xff0c;下面我們就把申請到的證書下載下來&#xff0c;放到一個文件夾里&#xff0c;并解壓接下來我們就…

升級tomcat7.0之后的問題

學習web也有幾天了&#xff0c;今天把tomcat改成7.0的之后老是出現嚴重警告&#xff1a; 嚴重: The web application [/struts2_0100] created a ThreadLocal with key of type [com.opensymphony.xwork2.inject.ContainerImpl$10](value[com.opensymphony.xwork2.inject.Conta…

慎重對待青霉素皮試

青霉素類藥不同品種間存在交叉過敏關系。 所以&#xff0c;中國藥典規定&#xff0c;青霉素類藥物在注射前必先使用青霉素鈉&#xff08;鉀&#xff09;及氯化鈉注射液配制的溶液做皮內敏感試驗。皮試液濃度為每毫升500單位&#xff0c; 皮內注射0.1毫升&#xff0c;陽性反應者…

2018阿里云雙11拼團大促主會場全攻略

為什么80%的碼農都做不了架構師&#xff1f;>>> 摘要&#xff1a; 在雙十一這個一年唯一一次的大幅度降價促銷日&#xff0c;怎樣才能花最少的錢配置最特惠的云服務&#xff1f;云棲社區特為各位開發者奉獻出省錢大法如下&#xff01; 2018阿里云雙十一拼團大促活動…

匿名用戶訪問用發布站點模板創建網站的列表項時要求登錄的問題解決

因為發布站點中的一個Feature被打開了&#xff0c;造成將列表FormPage的查看給Lock了&#xff0c;所以需要登錄&#xff0c;將其關閉就OK了。哈哈。英文KB&#xff1a;Users are unexpectedly prompted to enter their credentials when they access a list in a Windows Share…

知識點1: 進度條隨數據變化,并添加漸變樣式

效果圖&#xff1a; dom&#xff1a; //  進度條             <div class"progress" :style"styleObj1"><div class"point"></div></div>//  數據容器<div class"precent"><counte…

第三篇.python編輯器和集成環境01

修改python的鏡像源 使用pip可以提高網速\Lib\site-packages\pip\models\index.py文件&#xff0c;將PYPI的值改為你所需要的鏡像源即可&#xff0c;例如改為豆瓣鏡像源&#xff1a; #PyPI Index(https://pypi.python.org/) PyPI Index(https://pypi.douban.com/) 轉載于:h…

常用SQL語句技法

下列語句部分是Mssql語句&#xff0c;不可以在access中使用。 SQL分類&#xff1a; DDL—數據定義語言(CREATE&#xff0c;ALTER&#xff0c;DROP&#xff0c;DECLARE) DML—數據操縱語言(SELECT&#xff0c;DELETE&#xff0c;UPDATE&#xff0c;INSERT) DCL—數據控制語言(GR…

JSP2.0中Simple Tag介紹

JSP2.0中為了簡化標簽的復雜性&#xff0c;增加了制作Simple Tag的標簽類SimpleTagSupport類。 SimpleTagSupport類是實現SimpleTag接口的。它只需要實現一個doTag()方法即可&#xff0c;而不需要一堆回傳值。 舉例說明&#xff1a; 例1&#xff1a;HelloSimpleTag標簽 第一步&…

[置頂] 動軟軟代碼生成器使用(127.0.0.1)無法看到 SQLServer2008 新附加數據庫的 原因 以及 解決方案...

在項目中&#xff0c;使用代碼生成器給我們的開發工作帶來了相當大的方便&#xff0c;而有時候會出現這樣的問題&#xff0c;就是新附加的數據庫在動軟代碼生成器當中看不到&#xff0c;奇了怪了 一&#xff0c;首先看動軟代碼生成器的鏈接字符串&#xff0c;如圖 &#xff0c;…