Makefile重新编译所有内容

时间:2016-04-17 15:48:07

标签: c makefile

我试图创建我的第一个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

提前致谢!

1 个答案:

答案 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构建,如果只更改一个源文件,则只能生成一个目标文件,并且链接可以再次执行。