我正在尝试创建我的第一个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)
提前致谢!
回答第一个问题:你的目标与他们生成的文件不匹配,这样修复.还要添加一个.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,如果您只更改一个源文件,您将只生成一个目标文件,并再次执行链接.
| 归档时间: |
|
| 查看次数: |
531 次 |
| 最近记录: |