试图编译一个朋友的代码-但是他没有包含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。
这些文件以各种方式纠缠在一起——如果我需要确切地展示这些纠缠的性质,我会这样做的。
我“make”和编译器要求:
ar: read.a: No such file or directory

不是这样的。a应该被生产出来吗?当然还没有。
我已经盯着看了一会儿,我觉得这一定是我缺少的一些简单的东西。

最佳答案

此命令:

$(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有用,如果它确实存在的话,是不重要的。)
目前尚不清楚您希望如何构建这些库,但这可能是朝着正确方向迈出的一步:
$(LIBRARY): $(LIB_OBJ)
    $(AR) $@ $(LIB_OBJ)
    $(RANLIB) $@

automatic variable$@扩展到目标的名称。您可以将另一个用于先决条件列表($(LIB_OBJ)),但让我们一次尝试一个新的东西。

关于c - Makefiles-ar:* .a:没有这样的文件或目录…但是有…就在那,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21446206/

10-13 01:21