makefile的編寫規則和示例

2021-08-03 04:41:09 字數 3619 閱讀 3687

例一:在乙個demo目錄下有三個目錄:分別是test, include, lib

test目錄下有三個目錄,分別是include和source和project,在目錄include下有三個檔案,分別是a.h,b.h,c.h,在source目錄下有三個檔案,分別是a.c,b.c,c.c,project目錄下放的是makefile檔案

include目錄下有多個標頭檔案,分別是d.h,m.h, n.h,f.h

lib目錄下有多個靜態庫,分別是:liberr.a,libarm.a

現在a.c包括a.h,b.h,d.h;b.c包括b.h,c.h,m.h,n.h;c.c包括a.h,b.h,c.h

現在要求寫乙個makefile檔案,把.c檔案編譯成.o檔案,並鏈結靜態庫,生成的目標檔案和可執行檔案。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

inc_path := -i./include/

lib_path := -l./lib/

libs 

:= $(lib_path) -lerr -larm

cc 

:= gcc

ld 

:= g++

cflags 

:= -o2 -wall $(inc_path)

src_path := ./source

source 

:= $(src_path)/a.c\

$(src_path)/b.c\

$(src_path)/c.c

target 

:= target

objs 

:= a.o b.o c.o

$(target): $(objs)

$(ld) -o2 -o $(target) $(objs) $(libs)

a.o : $(src_path)/a.c

$(cc) $(cflags) -c -o $@ $<

b.o : $(src_path)/b.c

$(cc) $(cflags) -c -o $@ $<

c.o : $(src_path)/c.c

$(cc) $(cflags) -c -o $@ $<

.phony: clean

clean:

-rm-f $(objs)

$《所有的依賴目標的集合。以空格分隔。如果在依賴目標中有多個重複的,那個這個變數

會去除重複的依賴目標,只保留乙份。這裡會自動替換成 $(src_path)/*.c 這樣的樣子。

$@ 表示規則中的目標檔案集。在模式規則中,如果有多個目標,那麼,"$@"就是匹配於

目標中模式定義的集合。這裡會自動替換成 a.o、b.o 或者 c.o。具體替換成什麼,要看他位於哪一條規則下面。

注釋的話,可以簡單的這麼說:

檔案主要分3部分;

第一部分就是各種 「:=」 的部分,用來宣告一些變數,以便於後邊使用;

第二部分是從第一部分之後一直到.phony之前,有四個重複的小段,每個段的結構都是

1

*** : yyy

1

cmd

1

*** 是 目標, yyy 是 依賴, cmd 是執行的命令。make時會自動從上往下執行,找到第乙個***,監察依賴yyy是否都存在。如果存在,執行cmd命令生成它;否則,找到yyy對應的規則,再遞迴的執行這個過程。注意cmd前面是乙個tab鍵,不能是空格。

1

最後的clean,是用來執行makeclean 時用來刪除掉編譯過程中生成的.o檔案

例二:(ct.cpp和run_ct.cpp都依賴於ct.h)

inc_path := -i/opt/local/include

libs_path := -l/opt/local/lib

libs := -lopencv_imgproc.2.4.9 -lopencv_calib3d.2.4.9 -lopencv_contrib.2.4.9 -lopencv_core.2.4.9 -lopencv_features2d.2.4.9 -lopencv_highgui.2.4.9 -lopencv_legacy.2.4.9  -lopencv_objdetect.2.4.9 -lopencv_video.2.4.9

cc := gcc

ld := g++

target := target

objs := ct.o run_ct.o

$(target) : $(objs)

$(ld) -o $(target) $(objs) $(libs_path) $(libs)

ct.o : ct.h

$(cc) -c ct.cpp $(inc_path)

run_ct.o : ct.h

$(cc) -c run_ct.cpp $(inc_path)

.phony: claen

claen:

-rm -f $(objs)

makefile編寫規則

目標 要生成的目標檔案 依賴 目標檔案由哪些檔案生成 命令 通過執行該命令由依賴檔案生成目標 代表目標 代表全部依賴 第一依賴 第一變化的依賴 2020 8 3 wildcard可以進行檔案匹配 patsubst 內容的替換 makefile的變數 代表目標 代表全部依賴 第一依賴 第一變化的依賴 ...

Makefile檔案編寫規則

makefile 中包含五種內容 顯式規則,隱式規則,變數定義,指令 directive 和注釋。1.顯式規則 描述如何生成規則的目標,它列出了目標依賴的檔案,指定了產生或更新目標的命令。2.隱式規則 描述如何生成基於檔名的一類檔案,說明目標可能依賴於和其檔名類似的檔案,指定了相應的命令。3.指令 ...

makefile編寫(一)基本規則

一 乙個簡單的例子 建立乙個malefile檔案如下 mian.o main.c a.h gcc c main.c 1.o 1.c a.h b.h gcc c 1.c 2.o 2.c b.h c.h gcc c 2.c 2 3 cc gcc 4 5 debug 6 cflags i.g wall a...