Iam尝试使用构建在自己的makefile上的几个静态库启动项目,如下所示:
LIBDIR= ../../lib/
SRC= mgui.c
-include $(SRC:%.c=%.d)
INC=-I../../inc \
-Iinc \
-I../../shared
EXEC= libmgui.lib
CFLAGS= -Wall -static -D$(DEBUG) -MMD -MP
ARFLAGS= rcs
AR = ar
all: $(SRC:%.c=%.o)
$(AR) $(ARFLAGS) $(LIBDIR)$(EXEC) $<
%.o: %.c
$(CC) -c $< -o $@ $(INC) $(CFLAGS)
该makefile是从更高级别的makefile运行的。
我在../../shared/文件夹中有globals.h文件,它包含在mgui.c中,如果我对该文件进行修改,则此makefile不起作用。它只是制作新的.o文件,但ar和新的.lib从未制作过,为什么?使用win8和mingw。
生成的依赖项文件如下所示:
mgui.o:mgui.c inc / mgui.h ../../ shared / globals.h
INC / mgui.h:
../../共享/ globals.h:
答案 0 :(得分:2)
您需要将-include
向下移动到makefile的末尾。 Make定义第一个目标(即使它在包含的文件中)并将其用作默认目标。由于include
是第一个,它将mgui.o
定义为第一个目标,这是唯一要构建的目标,除非您明确运行make all
。
此外,您不应该在all
目标规则中放置配方来构建库。如果这样做,那么即使没有任何变化,也会重建该库。
你应该把它写成:
all: $(LIBDIR)$(EXEC)
$(LIBDIR)$(EXEC): $(SRC:%.c=%.o)
$(AR) $(ARFLAGS) $@ $<