C Makefile重新编译所有内容

C Makefile重新编译所有内容,c,makefile,C,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 另外,正如您

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

提前谢谢

回答第一个问题:您的目标与他们生成的文件不匹配,请按此方式修复。另外,添加一个.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,使用您编写的任意数量的模块,每个模块都有一个header.h和一个source file.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)

第一次使用“全部生成”,如果只更改一个源文件,则只需生成一个目标文件,并再次执行链接。

回答第一个问题:您的目标与它们生成的文件不匹配,请按此方式修复。另外,添加一个.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,使用您编写的任意数量的模块,每个模块都有一个header.h和一个source file.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建造,如果您只更改一个源文件,您将只需要生成一个对象文件,并再次执行链接。

您的目标与命令的输出不同您的目标与命令的输出不同是否应该全部为:bin/rmdup bin/lsall bin/lsdir而不是全部:bin/rmdup lsall lsdir?谢谢,它成功了!我已经试过这样做了,但我忘了更改all:以及:/all:bin/rmdup bin/lsall bin/lsdir而不是all:bin/rmdup lsall lsdir吗?谢谢,成功了!我已经试过这样做了,但我忘了更改所有:以及:/