每次都进行重新运行构建

时间:2020-08-10 19:45:40

标签: makefile gnu-make

我有这个Makefile

# Variables
CC = gcc
CFLAGS = -Wall -g -c
ODUMP = objdump
ODFLAGS = -d

# Directories
OBJDIR := obj
TGTDIR := target
SRCDIR := src
DMPDIR := dump

# Sources list
SRCS := main.c kernel.c
# Sources location
VPATH := src:../headers

# Objects list
objects = $(notdir $(patsubst %.c,%.o,$(addprefix $(SRCDIR)/,$(SRCS))))
# Objects list with prefix
prefix_objs = $(addprefix $(OBJDIR)/, $(objects))

# Target name
target = main

$(target) : $(objects)
    $(CC) -o $(TGTDIR)/$@ $(prefix_objs)

%.o: %.c | folders
    $(CC) $(CFLAGS) -o $(OBJDIR)/$@ $<
    $(ODUMP) $(ODFLAGS) $(OBJDIR)/$@ > $(DMPDIR)/$@

folders:
    mkdir -p $(OBJDIR)
    mkdir -p $(TGTDIR)
    mkdir -p $(DMPDIR)

.PHONY: clean
clean:
    rm -rf $(OBJDIR) $(TGTDIR) $(DMPDIR)

我对这个makefile非常满意。我还有一些调整,但是主要的问题陈述如下。

即使不更改任何文件,每次运行make时,整个项目都会重新生成(在这种情况下,仅是main.c和kernel.c)

运行make后的输出是...

mkdir -p obj
mkdir -p target
mkdir -p dump
gcc -Wall -g -c -o obj/main.o src/main.c
objdump -d obj/main.o > dump/main.o
gcc -Wall -g -c -o obj/kernel.o src/kernel.c
objdump -d obj/kernel.o > dump/kernel.o
gcc -o target/main obj/main.o obj/kernel.o

然后再次运行make后,它就是...

mkdir -p obj
mkdir -p target
mkdir -p dump
gcc -Wall -g -c -o obj/main.o src/main.c
objdump -d obj/main.o > dump/main.o
gcc -Wall -g -c -o obj/kernel.o src/kernel.c
objdump -d obj/kernel.o > dump/kernel.o
gcc -o target/main obj/main.o obj/kernel.o

我的文件结构如下

| dump
| obj
| src ----
    | kernel.c
    | kernel.h
    | main.c
| target
.gitignore
Makefile
README.md

修改 我将目标设置为$(OBJDIR)/%.o: %.c | folders$(prefix_objs)/%.o: %.c | folders

但是得到了...

gcc -Wall -g -c   -c -o main.o src/main.c
gcc -Wall -g -c   -c -o kernel.o src/kernel.c
gcc -o target/main obj/main.o obj/kernel.o
gcc: error: obj/main.o: No such file or directory
gcc: error: obj/kernel.o: No such file or directory
gcc: fatal error: no input files
compilation terminated.
make: *** [Makefile:27: main] Error 1

这对我来说很奇怪,因为配方相同。

    $(CC) $(CFLAGS) -o $(OBJDIR)/$@ $<
    $(ODUMP) $(ODFLAGS) $(OBJDIR)/$@ > $(DMPDIR)/$@

绝对不应该产生上面的日志。

编辑2 好的。这个更改让我走得更远。


$(target) : $(prefix_objs)
    $(CC) -o $(TGTDIR)/$@ $(prefix_objs)

$(OBJDIR)/%.o: %.c | folders
    $(CC) $(CFLAGS) -o $@ $<
    $(ODUMP) $(ODFLAGS) $@ > $(DMPDIR)/$@

我知道了...

mkdir -p obj
mkdir -p target
mkdir -p dump
gcc -Wall -g -c -o obj/main.o src/main.c
objdump -d obj/main.o > dump/obj/main.o
/bin/sh: 1: cannot create dump/obj/main.o: Directory nonexistent
make: *** [Makefile:31: obj/main.o] Error 2

这确实将我带入下一期。我将在另一篇文章中提到嵌套的目录和文件。因此,只需手动创建dump / obj文件夹即可使它正常工作,现在,每次我运行make时,仅在最后进行重新链接!

mkdir -p obj
mkdir -p target
mkdir -p dump/obj
gcc -o target/main obj/main.o obj/kernel.o

0 个答案:

没有答案