makefile的编写规则和示例

来源:互联网 发布:网络工具箱套装 编辑:程序博客网 时间:2024/06/11 23:32
例一:在一个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 $@ $<</code>
b.o $(SRC_PATH)/b.c
    $(CC) $(CFLAGS) -c -o $@ $<</code>
c.o $(SRC_PATH)/c.c
    $(CC) $(CFLAGS) -c -o $@ $<</code>
.PHONY: clean
clean:
    -rm -f $(OBJS)

$<所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量
会去除重复的依赖目标,只保留一份。这里会自动替换成 $(SRC_PATH)/*.c这样的样子。
$@   表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于
目标中模式定义的集合。这里会自动替换成 a.o、b.o 或者 c.o。具体替换成什么,要看他位于哪一条规则下面。

注释的话,可以简单的这么说:

  1. 文件主要分3部分;

  2. 第一部分就是各种 “:=”的部分,用来声明一些变量,以便于后边使用;

  3. 第二部分是从第一部分之后一直到.PHONY之前,有四个重复的小段,每个段的结构都是

    1
    XXX YYY
    1
        CMD
    1
        XXX 是 目标, YYY 是 依赖, CMD 是执行的命令。make时会自动从上往下执行,找到第一个XXX,监察依赖YYY是否都存在。如果存在,执行CMD命令生成它;否则,找到YYY对应的规则,再递归的运行这个过程。注意CMD前面是一个Tab键,不能是空格。
  4. 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) -cct.cpp $(INC_PATH)

run_ct.o : ct.h

       $(CC) -crun_ct.cpp $(INC_PATH)

.PHONY: claen

claen:

       -rm -f$(OBJS)

原创粉丝点击