例一:在乙個demo目錄下有三個目錄:分別是test, include, lib1test目錄下有三個目錄,分別是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檔案,並鏈結靜態庫,生成的目標檔案和可執行檔案。
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,是用來執行
make
clean 時用來刪除掉編譯過程中生成的.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...