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

问题描述 投票:0回答:1

尝试编译朋友的代码 - 但他没有包含 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不是应该被生成的情况吗?当然还没有。

我已经盯着看了一会儿,我觉得这一定是我错过的一些简单的东西。

c makefile
1个回答
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) $@

自动变量

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

© www.soinside.com 2019 - 2024. All rights reserved.