试图编译一个朋友的代码-但是他没有包含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/