makefile学习笔记

多个源文件编译目标:

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 $@)"

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值