Makefile - ar:* .a:没有这样的文件或目录....但是......它就在那里

时间:2014-01-30 01:28:41

标签: c makefile

尝试编译朋友的代码 - 但他没有包含Makefile,我自己构建并且遇到了我遇到的问题。

我认为最好发布下面Makefile的全部内容......我试着保持简短!

CFLAGS  = -Wall -pedantic
LFLAGS  =
CC      = gcc
RM      = /bin/rm -rf
AR      = ar rc
RANLIB  = ranlib

LIBRARY = const.a read.a descr.a

LIB_SRC = read.c futex.c testy.c

LIB_OBJ = $(patsubst %.c,%.o,$(LIB_SRC))

# pattern rule for object files
%.o: %.c
         $(CC) -c $(CFLAGS) $< -o $@

all: $(LIBRARY)

$(LIBRARY): $(LIB_OBJ)
        $(AR) $(LIBRARY) $(LIB_OBJ)
    $(RANLIB) $(LIBRARY)

clean:
    $(RM) $(LIBRARY) $(LIB_OBJ)

.PHONY: depend
depend:
        $(CFLAGS) -- $(LIB_SRC)  2>/dev/null

所有文件const.h,read.h和descr.h都在我调用make的目录中。同样适用于read.c,futex.c和testy.c。

文件以各种方式纠缠在一起 - 如果我需要准确显示这些纠缠的本质,我会这样做。

我'做'并且编译器声称:

ar: read.a: No such file or directory

是不是应该生成read.a?当然它还没有。

我现在已经盯了一会儿,我觉得这一定是我想念的简单。

1 个答案:

答案 0 :(得分:3)

此命令:

$(AR) $(LIBRARY) $(LIB_OBJ)

扩展到:

ar rc const.a read.a descr.a read.o futex.o testy.o

因此,当Make尝试构建const.a时,它会告诉ar将多个文件合并到const.a,从read.a开始,ar抱怨有没有这样的文件。 (ar是否可以对read.a执行任何有用的操作(如果确实存在)并不重要。)

目前尚不清楚Make如何构建这些库,但这可能是朝着正确方向迈出的一步:

$(LIBRARY): $(LIB_OBJ)
    $(AR) $@ $(LIB_OBJ)
    $(RANLIB) $@

automatic variable $@扩展为目标名称。您可以使用另一个作为先决条件列表($(LIB_OBJ)),但让我们一次尝试一件新事物。