原文地址:简单通用的Makefile(转)做者:黑暗幽灵 html
本人是一个刚接触嵌入式的菜鸟,由于最近写完程序老要编译,老是要写Makefile, sql
因此找了一个通用的Makefile, app
做者:杨硕,华清远见嵌入式学院讲师。 性能
下面这个Makefile就能够知足这个要求: 学习
SRCS = $(wildcard *.c) ui
OBJS = $(SRCS:.c = .o) spa
CC = gcc sqlite
INCLUDES = -I/home/noah/build_sqlite3/include htm
LIBS = -L/home/noah/build_sqlite3/lib -lsqlite3 blog
CCFLAGS = -g -Wall -O0
my_app : $(OBJS)
$(CC) $^ -o $@ $(INCLUDES) $(LIBS)
%.o : %.c
$(CC) -c $< $(CCFLAGS)
clean:
rm *.o
你们看这个Makefile和前一个比起来是否是简洁不少,固然理解起来不如上一个那么直观。实际上编写Makefile就是为了提升咱们的工做效率,而不是增长咱们的工做量。所以Makefile为咱们提供了不少强大的功能,好比定义变量,使用通配符等等。只要合理利用,就能够达到事半功倍的效果。
下面咱们一条一条分析这个Makefile:
SRCS = $(wildcard *.c)
这条语句定义了一个变量SRCS,它的值就是当前面目录下面全部的以.c结尾的源文件。
OBJS = $(SRCS:.c = .o)
这里变量OBJS的值就是将SRCS里面全部.c文件编译出的.o目标文件
CC = gcc
变量CC表明咱们要使用的编译器
INCLUDES = -I/home/noah/build_sqlite3/include
LIBS = -L/home/noah/build_sqlite3/lib -lsqlite3
这里指定除了编译器默认的头文件和库文件的路径以外须要额外引用的头文件路径以及库的路径。
CCFLAGS = -g -Wall -O0
CCFLAGS变量存放的是编译选项
my_app : $(OBJS)
$(CC) $^ -o $@ $(INCLUDES) $(LIBS)
my_app依赖于全部的.o文件,$^表明$(OBJS),$@表明my_app
%.o : %.c
$(CC) -c $< $(CCFLAGS)
将全部的.c源代码编译成.o目标文件,这样写是否是很省事?
clean:
rm *.o
在执行make clean以后删除全部编译过程当中生成的.o文件。
这个Makefile就具有灵活的通用性,咱们只要对它稍做修改就能够用在本身的工程里面。固然Makefile还有不少强大的功能,须要咱们进一步学习。
补充1:= := ?= +=
makefile 中 = := ?= +=的意义:
= 是最基本的赋值
:= 是覆盖以前的值
?= 是若是没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值
补充2:.PHONY
install:foo
install -m 644 foo /usr/bin
.PHONY: install
看以上makefile的片断,使用了.PHONY这个目标,下面详细介绍她的用法.
来源:点击打开连接
.PHONY是一个特殊工做目标(special target)
它用来指定一个假想的工做目标,也就是说它后面的并非一个实际文件,并且确定要视为未更新(也就是说条件老是知足,须要处理)
PHONY 目标并不是实际的文件名:只是在显式请求时执行命令的名字。有两种理由须要使用PHONY 目标:避免和同名文件冲突(防止存在和PHONY执行目标的名称相同的文件,虽然在写比较小的makefile工程的时候看不出来.PHONY的好处,可是当面对一些大工程的时候,.PHONY则显得至关有用),改善性能。