【发布时间】:2015-09-13 21:02:56
【问题描述】:
我正在使用以下简单的 Makefile 来构建一些简单的文件。我对制作 Makefile 真的很陌生。我不知道为什么它一直在重建,即使文件是在第一次 make 之后构建的并且我没有编辑任何文件。
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
新编辑的 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
每当我触摸 StarterWare_Files/example.h 并尝试再次进行 make 时,它都会向我抛出错误,即 gcc 无法将 -o 指定为 -c 或 -S 指定多个文件。基本上命令变成这样 gcc -o main.o -IStarterWare_Files -c main.c StarterWare_Files/test.h StarterWare_Files/add.h..
【问题讨论】:
-
正在重建
$(MAIN_OBS)?$(LIB_OBS)?$(EXE)?他们都是?运行make -d并查看输出,它会告诉您它认为需要重建的内容以及原因。你的makefile也不正确。它告诉 make 每个.o文件都有 every.c文件作为先决条件,而不仅仅是它的匹配文件。因此,更改 any.c文件将重新编译该集合中的 every.o文件。 -
@EtanReisner 是的,它正在构建所有这些。如何做出这样的改变?它只引用它自己的 C 文件。
-
它可能只是再次构建
$(LIB_OBS)文件。那是因为您在设置$(LIB_OBS)的值时从.c文件中删除了目录前缀,但是您随后让目标在目录中创建.o文件,因此 make 无法匹配这些文件(因为foo.o与StarterWare_Files/foo.o不同)。 -
@EtanReisner 感谢您指出这一点
-
@EtanReisner $^ 的意义是什么?