makefile - Makefile总是重建

标签 makefile gnu-make

我正在使用以下简单的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

新编辑的制作文件
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

每当我触摸StarterWare_Files/example.h并尝试再次进行制作时,都会引发错误,gcc无法将-o与-c或-S与多个文件一起指定。基本上,该命令将变为以下形式:gcc -o main.o -IStarterWare_Files -c main.c StarterWare_Files/test.h StarterWare_Files/add.h。

最佳答案

您的默认目标是output,但是您的makefile永远不会生成这样的文件,因此,每次您调用make时,它都会尝试生成output文件。

解决方案是将output目标标记为phony target。以及clean目标:

.PHONY: output clean

您可以利用built-in rules来从.oautomatic variables编译.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   

如果您想自动生成 header 依赖项,请添加:
# 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)

关于makefile - Makefile总是重建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31081131/

相关文章:

c++ - 用于构建 C++ Google Protocol Buffers 项目的 Makefile

makefile - 不同目录中文件的模式规则?

makefile - GNU Make 3.80 eval 错误的解决方法

android - 使用Gradle开发Android AOSP应用

c++ - 在 makefile 中,目录名称是假目标还是 "real"目标?

gnu-make - 使用 gnu make 中的一个命令从多个文件制作多个文件

c++ - 为具有不同标志的目标文件重构 Makefile

linux - 如何调用位于其他目录的Makefile?

build-process - ./configure 有什么用(除了检查依赖关系)

ubuntu - glob 调用中 Ubuntu 18.04 上的 GNU Make 3.82 段错误