什么是makefile?
Makefile文件描述了整个程序的编译,链接等规则。其中包括工程中哪些源文件需要编译以及如何编译,如何最后产生我们需要得到的文件。
好处:可以实现“自动化”编译,写好makefile文件后只需一个make命令,整个工程完全自动编译,提高软件开发的效率。
Makefile可生成的文件类型
一个Makefile文件可生成多个文件,文件可以为以下几种类型:
C/C++的应用程序
C/C++的动态链接库
C/C++的静态链接库
通过一个小例子观察规则
C程序源码:test 对应的makefile文件:
#include<stdio.h> test:hello.c
int main() gcc -o test test.c
{ .PHONY:clean
printf(“demotest”); clean:
return 0; rm -f *.o test
}
注意:每个命令的开头必须以[tab]开头。
makefile的书写规则
规则:用于说明如何生成目标文件,格式如下:
目标:依赖
命令
伪目标:
命令
变量及常用的函数
$^:代表所有依赖文件 $@:代表目标的集合
$<:代表第一个依赖文件 ifeq<a,b> endif
$(patsubst ,,
常见的系统预变量定义
CROSS_COMPILE(CC):=交叉编译,默认为空
LIBS:=对应链接的相关库
LDFLAGS :=表示编译器会用到的一些优化参数或者库所在的目录
CFLAGS:=表示用于C编译器的选项
什么是动态链接库和静态链接库
库就是通常把一些公用函数制作成函数库,供其它程序使用,这些做成的函数库就是链接库。
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
Makefile的实用模板
执行程序模板
SOURCE := $(%.c)
OBJS :=
(
p
a
t
s
u
b
s
t
(patsubst %.c,%.o,
(patsubst(SOURCE))
TARGET := test
CC := gcc
LIBS :=
LDFLAGS :=
DEFINES :=
INCLUDE := -I.
CFLAGS := -g -Wall -O3 $(DEFINES) $(INCLUDE)
CXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_H
.PHONY:clean
clean:
rm -rf *.o *.so
$(TARGET) : $(OBJS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)
静态库模板
SOURCE := $(%.c)
OBJS :=
(
p
a
t
s
u
b
s
t
(patsubst %.c,%.o,
(patsubst(SOURCE))
TARGET := libtest.a
CC := gcc
AR = ar
LIBS :=
LDFLAGS :=
DEFINES :=
INCLUDE := -I.
CFLAGS := -g -Wall -O3 $(DEFINES) $(INCLUDE)
CXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_H
.PHONY:clean
clean:
rm -rf *.o *.so
$(TARGET) : $(OBJS)
$(AR) crs $(TARGET) $(OBJS) $(RANLIB) $(TARGET)
动态库模板
SOURCE := $(%.c)
OBJS :=
(
p
a
t
s
u
b
s
t
(patsubst %.c,%.o,
(patsubst(SOURCE))
TARGET := libtest.a
CC := gcc
LIBS :=
LDFLAGS :=
DEFINES :=
INCLUDE := -I.
CFLAGS := -g -Wall -O3 $(DEFINES) $(INCLUDE)
CXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_H
SHARE := -fPIC -shared -o
.PHONY:clean
clean:
rm -rf *.o *.so $(TARGET)
$(TARGET) : $(OBJS)
$(CC) $(CFLAGS) $(SHARE) $@ $(OBJS) $(LDFLAGS) $(LIBS)