1. 程式人生 > >《makefile學習筆記》

《makefile學習筆記》

本文記錄了makefile的簡單用法,在linux上編譯多個檔案的c程式可以用得上。

  1. Makefile命名:Makefile或makefile
  2. makefile規則三要素:
    目標,依賴,命令
    方法1:這裡我們通過簡單的Makefile將下面幾個檔案生成可執行檔案:
    首先將main.c,mul.c,add.c,calc.h放進Makefile資料夾,在資料夾建立makefile檔案,內容如下(注意第二行前必須要有tab縮排):
    在這裡插入圖片描述
    然後輸入make
    在這裡插入圖片描述
    如果依賴檔案不在本目錄,在依賴檔案部分要加上。

方法2:只會對修改了的檔案進行編譯,makefile內容如下:

app:main.o add.o mul.o
gcc main.o add.o mul.o -o app
main.o:main.c
gcc -c main.c
add.o:add.c
gcc -c add.c
mul.o:mul.c
gcc -c mul.c
在這裡插入圖片描述


在這裡插入圖片描述
此時修改其中的add.c檔案,再make編譯,只有修改了的檔案被編譯。
在這裡插入圖片描述
工作原理:
在這裡插入圖片描述
在這裡插入圖片描述

  1. makefile中的變數
    直接輸入名稱,不需要定義型別

%.o:%.c:將%替換為依賴項的名稱:如main.o:main.c gcc -c $< -o $@ makefile中的自動變數:
$<:規則中的第一個依賴 $@:規則中的目標 $^:規則中的所有依賴 只能在規則的命令中使用 用變數實現第2點中方法2的makefile

obj=main.o add.o mul.o
target=app
(target):(target):(obj)
gcc $(obj) -o $(target)
%.o:%.c
gcc -c $< -o $@

在這裡插入圖片描述
Makefile中自己維護的變數(大寫字母):
CC=gcc (CC=預設值為cc,也就是gcc)
CPPFLAGS = -I 前處理器需要的選項如:-I
CFLAGS:編譯時使用的引數 –Wall –g –c
LDFLAGS:連結庫使用的選項 –L –l
使用變數方式:$(變數名)

  1. makefile中的函式(所有函式都有返回值)
    對上一個方法進行改進:

(1) 獲取指定目錄./下.c檔案:src=(wildcard./.c)2.c.oobj=(wildcard ./*.c) (2) 把當前目錄所有的.c匹配為.o檔案:obj=

c)2.c.oobj=(patsubst ./%.o,./%.c,$src) 修改後內容如下:

target=app
src=$(wildcard ./*.c)
obj=$(patsubst ./%.c, ./%.o, $(src))
$(target):$(obj)
        gcc $(obj) -o $(target)
%.o:%.c
        gcc -c $< -o $@

然後make:
在這裡插入圖片描述
當再次make時可能會報make: ‘app’ is up to date.此時需要刪除檔案中生成的.o檔案
此時可以在makefile檔案中增加刪除*.o檔案的語句,在makefile末尾增加:

clean:
        rm $(obj) $(target)

在這裡插入圖片描述
要執行該語句:make clean (clean之前的命令不執行)
若要強制執行某一命令,在末尾加上-f,比如在上面的makefile強制刪除.o檔案:

rm $(obj) $(target) –f

如果檔案目錄下有個新建檔案和clean同名,此時make clean也會一直報make: ‘app’ is up to date.
此時需要將clean變為偽目標,在makefile修改如下(.PHONY:clean)
在這裡插入圖片描述
如果在clean下面加入一句建立資料夾的語句:mkdir /aa ,那麼在執行make clean時肯定會出錯,此時在前面加上 -(即-mkdir /aa),可以在出錯的情況下跳過該語句。