網站首頁 編程語言 正文
為什么要使用Makefile
簡單來說,當我們寫一個稍微大一些項目的時候,如果我們要執行一個程序那得編譯很多個文件并且還得鏈接起來,如果沒有Makefile我們就得一個一個編譯一個一個鏈接那真的是又臭又長(而且還會經常寫錯),而Makefile就能夠很好的解決這個問題,所以說掌握好Makefile的編寫是很有必要的
Makefile的編寫
程序的編譯和鏈接
使用C、C++編寫可執行程序,首先要把源文件編譯成中間代碼文件,Linux下是 .o 文件,即 Object File,這個動作叫做編譯(compile)。然后再把大量的Object File合成執行文件,這個動作叫作鏈接(link)。
一個項目,擁有成百上千的源程序文件,編譯鏈接這些源文件都是由規則的,Makefile閃亮登場!Makefile確定整個工程的編譯規則,只需要一個make命令,就可以實現“自動化編譯”。make是一個解釋makefile中指令的命令工具,一般來說,大多數的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。
Make 工作原理
通常在一個項目里,我們的規則是:
1)如果這個工程沒有編譯過,那么我們的所有C文件都要編譯并被鏈接。
2)如果這個工程的某幾個C文件被修改,那么我們只編譯被修改的C文件,并鏈接目標程序。
3)如果這個工程的頭文件被改變了,那么我們需要編譯引用了這幾個頭文件的C文件,并鏈接目標程序。
其實就是智能的識別哪些編譯鏈接需要做,哪些不用做避免不必要的時間消耗
只要我們的Makefile寫得夠好,我們只用一個make命令就可以完成,make命令會自動智能地根據當前的文件修改的情況來確定哪些文件需要重編譯,從而自己編譯所需要的文件和鏈接目標程序。
Makefile的規則
target … : prerequisites …
command
…
…target:也就是一個目標文件,可以是ObjectFile,也可以是執行文件。還可以是一個標簽(Label),對于標簽這種特性,暫不敘述。
prerequisites:要生成那個target所需要的文件或是目標。
command:也就是make需要執行的命令。(任意的Shell命令)
這是一個文件的依賴關系,也就是說,target這一個或多個的目標文件依賴于prerequisites中的文件,其生成規則定義在command中。說白一點就是說,prerequisites中如果有一個以上的文件比target文件要新的話,command所定義的命令就會被執行。這就是Makefile的規則。也就是Makefile中最核心的內容。
一個范例:
hello_demo : hellospeak.o speak.o //由hellospeak.o speak.o鏈接成目標hello_demo gcc -o hello_demo hellospeak.o speak.o //執行下面的命令 hellospeak.o : hellospeak.c speak.h //如果一些hellospeak.c的函數聲明是在頭文件speak.h中那么也得在這后面加上 gcc -c hellospeak.c speak.o : speak.c speak.h gcc -c speak.c clean : rm hello_demo speak.o hellospeak.o //當執行make clean時就會執行這個語句
下面是我寫的整體例子
//speak.h #include#include void helloSpeak(); -------------------------------------------------------------- //speak.c #include"speak.h" void helloSpeak() { printf("Hello Makefile\n"); } -------------------------------------------------------------- //main.c #include"speak.h" int main() { helloSpeak(); return 0; } -------------------------------------------------------------- //Makefile Hello: main.o speak.o gcc -o Hello main.o speak.o main.o: main.c speak.h gcc -c main.c speak.o: speak.c speak.h gcc -c speak.c clean: rm Hello speak.o main.o ~
運行效果??
原文鏈接:https://blog.csdn.net/Jacksqh/article/details/123299614
相關推薦
- 2022-03-31 聊聊Python?String型列表求最值的問題_python
- 2022-10-01 windows?server?2016?搭建FTP服務器詳細教程_FTP服務器
- 2022-12-06 詳解Python的整數是如何實現的_python
- 2023-03-18 Android?UI動態設置帶有Stroke漸變色背景Drawable_Android
- 2022-03-17 sqlsever2019文件創建與變量示例_數據庫其它
- 2023-01-20 Python使用窮舉法求兩個數的最大公約數問題_python
- 2023-06-04 Kotlin比較與解釋Lazy與Lateinit的用法_Android
- 2022-08-15 linux交叉編譯依賴包
- 最近更新
-
- 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同步修改后的遠程分支