日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux学习:makefile介绍

發(fā)布時間:2024/9/30 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux学习:makefile介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、為什么使用 makefile?

makefile 帶來的好處就是“自動化編譯”,一旦寫好,只需要一個 make 命令, 整個工程完全自動編譯, 極大的提高了軟件開發(fā)的效率。
同時,makefile 文件中可以定義一系列的規(guī)則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進(jìn)行更復(fù)雜的功能操作,因為 makefile 就像一個 Shell 腳本一樣,其中也可以執(zhí)行操作系統(tǒng)的命令。

二、makefile 的命名規(guī)則

(1)規(guī)則:

目標(biāo)...: 依賴... // 注意:一個 makefile 中可以有多個規(guī)則 (tab)命令 // 注意:tab 縮進(jìn)不能是 4 個空格.....

(2)三要素:
目標(biāo):要生成的目標(biāo)文件。
依賴:目標(biāo)文件由哪些文件生成。
命令:如何通過執(zhí)行該命令使依賴文件生成目標(biāo)文件。

三、makefile 的設(shè)計思路

(1) 需求:
1)含有頭文件、加減乘除的實現(xiàn)文件、測試 main 文件。
(include 目錄包含 head.h 、add.c div.c mul.c sub.c 、main.c) 。
2)將這 3 類文件制作成 makefile 文件,實現(xiàn)自動編譯,生成 app 可執(zhí)行文件。

1、第一版本:最簡單

app: add.c div.c mul.c sub.c main.cgcc add.c div.c mul.c sub.c main.c -o app -I include

(1)說明:
目標(biāo):app 文件
依賴:用于生成目標(biāo)(add.c div.c mul.c sub.c main.c)
命令:gcc 編譯(-o 指定名稱 app 因為有頭文件,所以要有 –I)
(2) 缺陷:
改變一個依賴文件(例:只 touch add.c 甚至不改變其內(nèi)容),所有依賴文件都要重新更新編譯

2、第二版本:依賴于.o 文件

app: main.o add.o div.o mul.o sub.ogcc main.o add.o div.o mul.o sub.o -o app

(1) 相較于第一個版本,依賴于.o 文件。
(2) 命令依然是 gcc,區(qū)別是由.o 生成 app。
(3)第一個目標(biāo)(app)稱為終極目標(biāo)。因為終極目標(biāo)依賴于.o 文件,所以需要依賴于“.c 文件”生成“.o 目標(biāo)”,因此,有以下內(nèi)容:

main.o: main.c gcc -c main.c -I include add.o: add.c gcc -c add.c -I include div.o: div.c gcc -c div.c -I include mul.o: mul.c gcc -c mul.c -I include sub.o: sub.c gcc -c sub.c -I include

(4)相較于第一版的好處是改變一個依賴文件,只有 改變的依賴文件和終極目標(biāo)需要重新生成,其他不動。
(5) 缺陷:
相似代碼體太多
(6)鋪墊知識:
1)makefile 中的變量:
makefile 中的變量有點類似于 C 語言中的宏定義,使用該變量相當(dāng)于內(nèi)容替換,使用變量可以使 makefile 易于維護(hù),修改起來變得簡單。
2)變量的分類:普通變量、自動變量
普通變量 (嚴(yán)格區(qū)分大小寫),定義 key = val 引用 val $(key)。舉例 foo = a.o b.o c.o $(foo) 就相當(dāng)于 a.o b.o c.o
自動變量:特別注意:自動變量只能在規(guī)則的命令中使用.
$@ 表示規(guī)則中的目標(biāo)
$< 表示規(guī)則中的第一個依賴條件
$^ 表示規(guī)則中的所有的依賴條件

3、第三版本: “模式規(guī)則”(利用 makefile 變量 和 占位符% 實現(xiàn))

app: main.o add.o div.o mul.o sub.o gcc $^ -o $@ // $^ 指所有的.o文件 //$@ 指app ,編譯所有的.o文件生成目標(biāo),并指定為app %.o:%.c // % 是占位符 gcc -c $< -o $@ -I include // $< 第一個的.c 文件 ,編譯一個.c 文件($<)生成.o 文件($@)

(1)缺陷:
終極目標(biāo) app 的依賴是完全定死的,扔到另一個項目中就不能用了,可移植性差。
(2)鋪墊知識:makefile 函數(shù)(所有的函數(shù)都有返回值,我們基本都是需要它的返回值)
1)wildcard :查找指定目錄下的指定類型的文件

src = $(wildcard ./*.c) //找到當(dāng)前目錄下所有后綴為.c 的文件,引用返回值給 src

2)patsubst :匹配替換

obj = $(patsubst %.c , %.o , $(src) ) //把 src 變量里所有后綴為.c 的文件替換成.o ,$(src) == *.c

4、第四版本:利用 makefile 函數(shù)

// makefile 函數(shù) src = $(wildcard *.c) // 當(dāng)前目錄下,所有 .c 文件 obj = $(patsubst %.c , %.o , $(src) ) // 當(dāng)前目錄下,所有 以.c 文件生成的.o 文件 // makefile 普通變量 target = app // 如果主體多次使用 app,想修改終極目標(biāo),只需要在這里改一次就行了 cc = gcc // makefile 自動變量(模式規(guī)則) $( target): $(obj) $(cc) $^ -o $@ %.o:%.c $(cc) -c $< -o $@ -I include

(1)缺陷:每次重新編譯都需要手工清理中間.o 文件和最終目標(biāo)文件
(2)鋪墊知識: clean / make clean
用途:清除編譯生成的中間.o 文件和最終目標(biāo)文件
1)出現(xiàn)的問題:make clean 如果當(dāng)前目錄下有同名 clean 文件,則不執(zhí)行用于清除的 clean 命令,這時解決方法為:.PHONY:clean(偽目標(biāo)聲明)。
效果:聲明偽目標(biāo)之后, makefile 將不會檢查該目標(biāo)是否存在或者該目標(biāo)是否需要更新。
2) clean 命令中的特殊符號:
– 此條命令出錯,make 也會繼續(xù)執(zhí)行后續(xù)的命令。如:-rm main.o。
rm –f :強(qiáng)制執(zhí)行,主要解決:如果要刪除的文件不存在使用 –f 不會報錯。
3)@不顯示命令本身,只顯示結(jié)果。如:@echo clean done
(3)其他:
1)make 默認(rèn)執(zhí)行終極目標(biāo),可通過“make 目標(biāo)名”指定要執(zhí)行的目標(biāo),例如 make clean。
2)make –f:例如,有 makefile、makefile1,使用 make 命令,默認(rèn)執(zhí)行 makefile,若想指定運行makefile1,則 make –f makefile1

5、第五版本:最終版本

// makefile 函數(shù) src = $(wildcard *.c) obj = $(patsubst %.c , %.o , $(src) ) // makefile 普通變量 target = app cc = gcc // makefile 自動變量(模式規(guī)則) $( target): $(obj)$(cc) $^ -o $@ %.o:%.c $(cc) $< -c -I include -o $@ // 清理工作 .PHONY: clean //添加偽目標(biāo),防止歧義 // 注意以 “." 開頭 clean:rm -f $(target) rm -f $(obj)

四、 makefile 的工作原理

1、目標(biāo)的生成

若想生成目標(biāo),首先檢查規(guī)則中的所有的依賴文件是否都存在:
如果有的依賴文件不存在, 則向下搜索規(guī)則,看是否有生成該依賴文件的規(guī)則:
(1)如果有規(guī)則用來生成該依賴文件,則執(zhí)行規(guī)則中的命令生成依賴文件,再生成終極目標(biāo)。
(2)如果沒有規(guī)則用來生成該依賴文件,則報錯
例如:
第一版本:依賴文件.c 都存在,直接生成目標(biāo)。
第二版本:依賴文件.o 不存在,向下搜索。
有生成該依賴文件的規(guī)則(依賴.c 生成目標(biāo).o)則也可以生成目標(biāo)。

2、目標(biāo)的更新:

如果所有依賴都存在,想要檢查規(guī)則中的目標(biāo)是否需要更新,必須先檢查它的所有依賴,依賴中有任何一個被更新,則有關(guān)目標(biāo)必須更新。
(1)說明:
第一版本中,一個依賴被更新,所有依賴都更新,然后更新終極目標(biāo)。
第二版本中,一個依賴被更新,只有該依賴對應(yīng)的目標(biāo)更新,然后再更新終極目標(biāo)。
(2)是否更新的判斷方法:看“依賴的最后訪問時間”是否晚于“目標(biāo)的最后訪問時間”。
依賴的最后訪問時間 < 目標(biāo)的最后生成時間 早于 不更新。
依賴的最后訪問時間 > 目標(biāo)的最后生成時間 晚于 更新。

總結(jié)

以上是生活随笔為你收集整理的Linux学习:makefile介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。