我有这个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