我使用以下简单的Makefile来构建一些简单的文件.我是制作Makefile的新手.我不知道为什么它继续重建,即使文件是在第一次制作之后构建的,而我不是在编辑任何文件.
EXE = nextgenrsm
CC = gcc
LIBS = StarterWare_Files/
CFLAGS = -c
INCLUDE_PATH = StarterWare_Files/
MAIN_SRC = $(wildcard *.c)
MAIN_OBS = $(patsubst %.c,%.o,$(MAIN_SRC))
LIB_SRC = $(wildcard StarterWare_Files/*.c)
LIB_OBS = $(patsubst StarterWare_Files/%.c,%.o,$(LIB_SRC))
output: $(EXE)
$(EXE): $(MAIN_OBS) $(LIB_OBS)
$(CC) $(MAIN_OBS) $(LIBS)$(LIB_OBS) -o $(EXE)
$(MAIN_OBS): $(MAIN_SRC)
$(CC) $(CFLAGS) *.c -I$(INCLUDE_PATH)
$(LIB_OBS): $(LIB_SRC)
cd $(LIBS); \
$(CC) $(CFLAGS) *.c -I../
clean:
rm -rf $(LIBS)*.o $(EXE) *.o
Run Code Online (Sandbox Code Playgroud)
新编辑的MAKEFILE
EXE = nextgenrsm
CC = gcc
LIBS = StarterWare_Files/
CPPFLAGS = _IStarterWare_Files/
MAIN_OBS = $(patsubst %.c,%.o,$(wildcard *.c))
LIB_OBS = $(patsubst %.c,%.o,$(wildcard StarterWare_Files/*.c))
all: $(EXE)
$(EXE): $(MAIN_OBS) $(LIB_OBS)
$(CC) -o $@ $(LDFLAGS) $(MAIN_OBS) $(LIB_OBS) $(LDLIBS)
%.o: %.c
$(CC) -o $@ -MD -MP $(CPPFLAGS) $(CFLAGS) -c $^
ALL_DEPS = $(patsubst %.o,%.d,$(MAIN_OBS), $(LIB_OBS))
-include $(ALL_DEPS)
clean:
rm -f $(LIB_OBS) $(EXE) $(MAIN_OBS) $(ALL_DEPS)
.PHONY: all clean
Run Code Online (Sandbox Code Playgroud)
每当我触摸StarterWare_Files/example.h并尝试再次制作时,它会抛出gcc无法指定-o with -c或-S with Multiple files的错误.基本上命令变成这样的东西gcc -o main.o -IStarterWare_Files -c main.c StarterWare_Files/test.h StarterWare_Files/add.h ..
Max*_*kin 13
您的默认目标是,output但您的makefile永远不会生成这样的文件,因此每次调用make它时都会尝试生成output文件.
解决方案是将output目标标记为虚假目标.以及clean目标:
.PHONY: output clean
Run Code Online (Sandbox Code Playgroud)
您可以充分利用内置的规则是编译.o自.c和自动变量,以减少你的makefile到:
EXE := nextgenrsm
CC := gcc
LIBS := StarterWare_Files/
CPPFLAGS := -IStarterWare_Files
MAIN_OBS := $(patsubst %.c,%.o,$(wildcard *.c))
LIB_OBS := $(patsubst %.c,%.o,$(wildcard StarterWare_Files/*.c))
all: $(EXE)
$(EXE) : $(MAIN_OBS) $(LIB_OBS)
$(CC) -o $@ $(LDFLAGS) $^ $(LDLIBS)
clean:
rm -f $(MAIN_OBS) $(LIB_OBS) $(EXE)
.PHONY: all clean
Run Code Online (Sandbox Code Playgroud)
如果你想自动生成头依赖关系生成添加:
# This rule produces .o and also .d (-MD -MP) from .c.
%.o : %.c
$(CC) -o $@ -MD -MP $(CPPFLAGS) $(CFLAGS) -c $<
# This includes all .d files produced along when building .o.
# On the first build there are not going to be any .d files.
# Hence, ignore include errors with -.
ALL_DEPS := $(patsubst %.o,%.d,$(MAIN_OBS) $(LIB_OBS))
-include $(ALL_DEPS)
clean:
rm -f $(MAIN_OBS) $(LIB_OBS) $(EXE) $(ALL_DEPS)
Run Code Online (Sandbox Code Playgroud)