Make不会运行ar并在对象更改后创建新库

时间:2014-02-14 16:53:01

标签: c makefile

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:

1 个答案:

答案 0 :(得分:2)

您需要将-include向下移动到makefile的末尾。 Make定义第一个目标(即使它在包含的文件中)并将其用作默认目标。由于include是第一个,它将mgui.o定义为第一个目标,这是唯一要构建的目标,除非您明确运行make all

此外,您不应该在all目标规则中放置配方来构建库。如果这样做,那么即使没有任何变化,也会重建该库。

你应该把它写成:

all: $(LIBDIR)$(EXEC)

$(LIBDIR)$(EXEC): $(SRC:%.c=%.o)
        $(AR) $(ARFLAGS) $@ $<