您的位置:首页 > 运维架构 > Linux

linux makefile详解?

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

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

如果你要把三个源文件.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))

等价与

OBJ = main.o func1.o func2.o

HEADER同理,换成.h

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

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

#make clean

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

#make CLEAN

才行。

PS:勤删除.o文件,不然会干扰对Makefile的测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: