Makefile 未触发隐式目标

Makefile 未触发隐式目标,makefile,Makefile,当在没有任何参数的情况下调用时,我的Makefile正在命中静态目标,但是由于没有构建其依赖项,因此失败。我已经将依赖项设置为隐式规则,如果我手动调用它们,make会说它没什么可做的(即使有)。。。我显然做错了什么,但我看不出是什么: CC=gcc CFLAGS=-Wall -fpic -O3 all: static shared doc clean: rm -rf *.o objects=dynamicArray.o directedGraph.o linkedList.o s

当在没有任何参数的情况下调用时,我的Makefile正在命中
静态
目标,但是由于没有构建其依赖项,因此失败。我已经将依赖项设置为隐式规则,如果我手动调用它们,
make
会说它没什么可做的(即使有)。。。我显然做错了什么,但我看不出是什么:

CC=gcc
CFLAGS=-Wall -fpic -O3

all: static shared doc

clean:
    rm -rf *.o


objects=dynamicArray.o directedGraph.o linkedList.o stack.o

dynamicArray.o: indexed/dynamicArray.c indexed/dynamicArray.h
directedGraph.o: graph/directedGraph.c graph/directedGraph.h indexed/dynamicArray.h
linkedList.o: graph/linkedList.c graph/directedGraph.h graph/linkedList.h 
stack.o: graph/stack.c graph/linkedList.h graph/stack.h 


# Static library
static: $(objects)
    $(AR) rcs libCS101.a $(objects)

# Shared library
shared: $(objects)
    $(CC) -shared -o libCS101.so $(objects)

# Documentation
doc: Doxyfile $(find . -name "*.dox" -or -name "*.h")
    doxygen

(目标文件
doc
也不起作用。它没有检测到
find
应该列出的文件中的更改,这使我相信像这样转义是不正确的…

您对各种对象文件的依赖关系的形式不符合系统的内置编译规则。它需要直接映射
%.o:%.c


索引的
图形
目录添加一个VPATH,然后从
.c
文件名中删除这些路径组件。

没有深入检查,我认为
文档
目标的问题是它应该是
$(shell find.-name…
,而且,作为一种良好的实践,配方中的
$(对象)
实例应替换为
$^
(一个自动变量,意思是“所有依赖项”),以便在不中断命令的情况下将对象编译到不同的目录。同样,您的
静态
共享
目标最好采用稍微不同的结构。您应该拥有
static:libCS101.a
shared:libCS101.so
,然后修改现有规则以按名称构建每个目标。然后,您可以将
-o
后面的名称替换为
$@
,这样它们也可以在不同的位置构建,并自动处理差异。感谢@Novelocrat:)这解决了所有问题如果您有
索引/foo.c
图形/foo.c
,会发生什么:它会选择哪一个?老实说,我不知道。我只想说“不要那样做”——即,在单个构建系统域中唯一地命名源文件。Make使用它找到的第一个文件:当您将VPATH定义为
索引图形时,它将选择
索引/foo.c
,当您将VPATH定义为
索引图形时,它将选择
图形/foo.c