多个源文件编译目标:
cc=gcc
target=app
objs=test1.o test2.o test3.o
CFLAGS= -I/opt/usrlib1/include -I/opt/usrlib2/include #指定头文件路径
LDFLAGS= -L/opt/usrlib1/lib -L/opt/usrlib2/lib -Os -lasound -lpthread #链接库的路径,库名字。根据需要
$(target):$(objs)
$(cc) $(objs) -o $(target) $(LDFLAGS)
%.o:%.c
$(cc) -c $^ -o $@ $(CFLAGS)
.PHONY:clean clear
clear:
rm -rf $(objs)
clean:
rm -rf $(objs) $(target)
同时编译多个目标:
CC=gcc
CFLAGS= -I/opt/usrlib1/include -I/opt/usrlib2/include #指定头文件路径
LDFLAGS= -L/opt/usrlib1/lib -L/opt/usrlib2/lib -lm -lpthread #链接库的路径,库名字。根据需要选择
EXAMPLES=app1 app2
OBJS=$(addsuffix .o,$(EXAMPLES)) #addsuffix函数,为对象添加后缀
%: %.o #模式匹配,所有依赖为xxx.o的目标定义为xxx,如依赖app1.o的目标定义为app1
$(CC) $< $(LDFLAGS) -o $@
%.o: %.c
$(CC) $< $(CFLAGS) -c -o $@
.phony: all clean
all: $(OBJS) $(EXAMPLES)
clean:
rm -rf $(EXAMPLES) $(OBJS)
目录下要求存在app1.c、app2.c源代码文件。
使用用户动态库时,需要配置全局变量,告诉程序运行时查找库的路径:
export LD_LIBRARY_PATH=/opt/usrlib1/lib:/opt/usrlib2/lib
Makefile变量
$^ 所有的依赖目标的集合,以空格分隔
$@ 表示规则中的目标文件集
$? 所有比目标新的依赖目标的集合,以空格分隔
$< 依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。
$(@D) 表示"$@"的目录部分(不以斜杠作为结尾) ,如果"$@"值是"dir/foo.o",那么"$(@D)"就是"dir",而如果"$@"中没有包含斜杠的话,其值就是"."(当前目录)
$(@F) 表示"$@"的文件部分,如果"$@"值是"dir/foo.o",那么"$(@F)"就是"foo.o","$(@F)"相当于函数"$(notdir $@)"