linux makefile详解?



下边的代码改了好几遍的了,基础的部分就不说了,重点记几点:$@是目标文件,$^是依赖的所有目标,$<是依赖的第一个。


这里重点测了一下依赖第一个的命令$<

如果你要把三个源文件.c编译成三个目标文件.o,再编译成最终的可运行文件。

这个$<是不能乱用的,必须配合“.c.o:”规则,这个规则是指所有.c依赖对应名称的.o,只有它才能配合$<完成完整编译(假设打包了,就算一个),不然的话真的是只编译规则依赖的第一个文件。


TARGET = main
SRC = main.c func1.c func2.c
#SRC =  func1.c func2.c main.c
OBJ = $(patsubst %.c,%.o,$(SRC))
HEADER = $(patsubst %.c,%.h,$(SRC))
CC = gcc
#$(TARGET) : $(OBJ)
#       $(CC) $(OBJ) -o $(TARGET)
#$(OBJ) : $(SRC)
#       $(CC) -c func1.h func2.h  $*.cpp -o  $@
#all : $(TARGET)


$(TARGET) : $(OBJ)
        $(CC) -o $@ $^
#$(OBJ) : $(SRC) $(HEADER)
.c.o:
#       $(CC) -c main.c
#       $(CC) -c $<
#func1.o func2.o main.o:  func1.c func2.c main.c
        gcc -c $<

CLEAN:
        rm *.o
        rm $(TARGET)

SRC = main.c func1.c func2.c

OBJ = $(patsubst %.c,%.o,$(SRC))

扫描二维码关注公众号,回复: 2643491 查看本文章

等价与

OBJ = main.o func1.o func2.o

HEADER同理,换成.h

patsubst是是替换用的,这是makefile里的函数,用法和C里的函数不太一样,$相当于返回值,()内部是函数名和参数名。





make创建的命令是大小写敏感并且完全自定义的,有些之所以用起来一样,是因为约定成俗,比如

#make clean

而本例真想删除目标文件和.o文件的话,要用

#make CLEAN

才行。







PS:勤删除.o文件,不然会干扰对Makefile的测试。





猜你喜欢

转载自blog.csdn.net/huqinweI987/article/details/50718954
今日推荐