我试图创建我的第一个Makefile,但是我有一个问题:即使没有任何改变,它也会重新编译所有内容。我怎么能避免这个?这是Makefile:
all: rmdup lsall lsdir
rmdup: rmdup.c
cc -Wall -o ./bin/rmdup rmdup.c
lsall: lsall.c
cc -Wall -o ./bin/lsall lsall.c
lsdir: lsdir.c
cc -Wall -o ./bin/lsdir lsdir.c
另外,正如您可能已经注意到的那样,编译结果需要在目录中./bin
还有一个问题:我所拥有的与此之间的区别是什么?
all: rmdup lsall lsdir
rmdup.o: rmdup.c
cc -Wall -c -o ./bin/rmdup.o rmdup.c
rmdup: rmdup.o
cc -o ./bin/rmdup ./bin/rmdup.o
lsall.o: lsall.c
cc -Wall -c -o ./bin/lsall.o lsall.c
lsall: lsall.o
cc -o ./bin/lsall ./bin/lsall.o
lsdir.o: lsdir.c
cc -Wall -c -o ./bin/lsdir.o lsdir.c
lsdir: lsdir.o
cc -o ./bin/lsdir ./bin/lsdir.o
提前致谢!
答案 0 :(得分:5)
回答第一个问题:你的目标与他们制作的文件不匹配,这样修复。还要添加.PHONY目标来告诉make all不是文件。
all: bin/rmdup bin/lsall bin/lsdir
bin/rmdup: rmdup.c
cc -Wall -o bin/rmdup rmdup.c
bin/lsall: lsall.c
cc -Wall -o bin/lsall lsall.c
bin/lsdir: lsdir.c
cc -Wall -o bin/lsdir lsdir.c
.PHONY: all
回答第二个问题:第二个makefile旨在编译目标文件,然后链接程序。链接几个目标文件时可能会很有趣。如果只修改了很少的源代码,它可以缩短构建时间。
编辑:为了澄清我对第二个问题的回答,这里有一个makefile,你可以用来编译一个程序,它的主要来源是main.c,并使用你编写的任意数量的模块,每个模块都有一个标题.h和一个源代码档案.c
CC=gcc
CFLAGS=-Wall -Wextra -Werror -stg=gnu99
LDFLAGS=-lm
SRCS=$(wildcard *.c)
OBJS=$(SRCS:%c=%.o)
HEADERS=$(wildcard *.h)
.PHONY:all mrproper clean
all:main
main:$(OBJS)
$(CC) -o $@ $? $(LDFLAGS)
main.o:main.c $(HEADERS)
$(CC) $(CFLAGS) -o $@ $<
%.o:%.c %.h
$(CC) $(CFLAGS) -o $@ $<
mrprorer:clean
rm -f main
clean:
rm -f $(OBJS)
您是第一次使用make all
构建,如果只更改一个源文件,则只能生成一个目标文件,并且链接可以再次执行。