尝试编译朋友的代码 - 但他没有包含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?当然它还没有。
我现在已经盯了一会儿,我觉得这一定是我想念的简单。
答案 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)
),但让我们一次尝试一件新事物。