【问题标题】:Make does not run ar and make new libraries after object changesMake 不运行 ar 并在对象更改后创建新库
【发布时间】:2014-02-15 03:01:50
【问题描述】:

我正在尝试使用几个基于自己的 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:

../../shared/globals.h:

【问题讨论】:

    标签: c makefile


    【解决方案1】:

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

    另外,您不应该将构建库的方法放在all 目标规则中。如果你这样做了,那么即使没有任何改变,该库也将始终重建。

    你应该写成:

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

    【讨论】:

    • 啊,是的,当然做到了,谢谢!在某个时候,我在 makefile 的末尾包含了该文件,但是还有其他问题,然后当我尝试所有内容时,我完全迷失了。
    猜你喜欢
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    相关资源
    最近更新 更多