尝试编译朋友的代码 - 但他没有包含 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
read.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
做任何有用的事情并不重要。)
尚不清楚您希望 Make 如何构建这些库,但这可能是朝着正确方向迈出的一步:
$(LIBRARY): $(LIB_OBJ)
$(AR) $@ $(LIB_OBJ)
$(RANLIB) $@
$@
扩展为目标的名称。您可以使用另一个作为先决条件列表 ($(LIB_OBJ)
),但让我们一次尝试一项新事物。