Makefile重新编译所有内容

Tir*_*esi 1 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
Run Code Online (Sandbox Code Playgroud)

另外,正如您可能已经注意到的那样,编译结果需要位于目录./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
Run Code Online (Sandbox Code Playgroud)

提前致谢!

jda*_*nay 6

回答第一个问题:你的目标与他们生成的文件不匹配,这样修复.还要添加一个.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
Run Code Online (Sandbox Code Playgroud)

回答第二个问题:第二个makefile用于编译目标文件,然后链接程序.链接几个目标文件时可能会很有趣.如果只修改了很少的源fiels,它会缩短构建时间.

编辑:为了澄清我对第二个问题的回答,这里有一个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)
Run Code Online (Sandbox Code Playgroud)

您第一次构建make all,如果您只更改一个源文件,您将只生成一个目标文件,并再次执行链接.