Makefile:循环 - 依赖性下降
Makefile: Circular - Dependency dropped
我设计了一个单独编译所有 .c 文件并分别生成 .o 的 Makefile(我认为这是隐式发生的并且工作得很好)。
可执行文件 (.out) 不是从 .o 文件生成的。
生成文件:
TARGET = all.out
OBJS = file1.o file2.o file3.o
CC = gcc
CFLAGS = -g -Wall
all : $(TARGET)
$(TARGET) : $(OBJS)
# gcc $^ -o $@
run : $(TARGET)
./$<
clean :
rm -rf *.o $(TARGET)
输出:
$ make
make: Circular all.out <- all dependency dropped.
gcc -g -Wall -c -o file1.o file1.c
gcc -g -Wall -c -o file2.o file2.c
gcc -g -Wall -c -o file3.o file3.c
cp file1.o a.out
注意: 如果第其中有 7 个未注释。
行号7:
# gcc $^ -o $@
行号时输出。 7 未注释(按预期完美工作):
gcc -g -Wall -c -o file1.o file1.c
gcc -g -Wall -c -o file2.o file2.c
gcc -g -Wall -c -o file3.o file3.c
gcc file1.o file2.o file3.o -o a.out
我是 Makefile 新手。
查询:
- 为什么评论行没有。 7 导致此问题并取消注释它完美无缺?
- 注释第 7 行时第一个输出中的 cp 是什么?
- circular - dependency dropped 错误发生了什么?
我无法解释您如何看待您向我们展示的问题。要么你上面写的实际上不是你正在使用的,要么你有一个有问题的 GNU make 版本。我无法重现您所看到的行为。
但是,我确定它与此有关:GNU make 有一个 built-in 规则,知道如何从文件 xx
为任何 xx
:
# make -p -f/dev/null
...
%.out: %
# recipe to execute (built-in):
@rm -f $@
cp $< $@
如果您将自己的配方作为显式规则注释掉,那么 make 将在它知道的模式规则中搜索一个,它会找到这个 built-in 模式规则。
但是根据您向我们展示的内容,这条规则 不应该 匹配:为了使其与 a.out
的目标匹配,make 会查找或了解如何构建目标 a
,但似乎不可用。此外,了解如何构建 a
将显示对 a.out
.
的循环依赖
如果您的 makefile 是:
TARGET = all.out
那么这一切都将变得非常有意义,因为您将拥有:
all : all.out
all.out : file1.o file2.o file3.o
并且在隐式规则匹配 %.out: %
之后它将像这样展开:
all : all.out
all.out : all file1.o file2.o file3.o
@rm -f all.out
cp all all.out
所以我假设当你将输出复制到你的问题时你改变了它:最好不要那样做。您应该 post 正是您所遇到的问题(并确认您仍然遇到 post 编辑的问题)。
我设计了一个单独编译所有 .c 文件并分别生成 .o 的 Makefile(我认为这是隐式发生的并且工作得很好)。
可执行文件 (.out) 不是从 .o 文件生成的。
生成文件:
TARGET = all.out
OBJS = file1.o file2.o file3.o
CC = gcc
CFLAGS = -g -Wall
all : $(TARGET)
$(TARGET) : $(OBJS)
# gcc $^ -o $@
run : $(TARGET)
./$<
clean :
rm -rf *.o $(TARGET)
输出:
$ make
make: Circular all.out <- all dependency dropped.
gcc -g -Wall -c -o file1.o file1.c
gcc -g -Wall -c -o file2.o file2.c
gcc -g -Wall -c -o file3.o file3.c
cp file1.o a.out
注意: 如果第其中有 7 个未注释。
行号7:
# gcc $^ -o $@
行号时输出。 7 未注释(按预期完美工作):
gcc -g -Wall -c -o file1.o file1.c
gcc -g -Wall -c -o file2.o file2.c
gcc -g -Wall -c -o file3.o file3.c
gcc file1.o file2.o file3.o -o a.out
我是 Makefile 新手。
查询:
- 为什么评论行没有。 7 导致此问题并取消注释它完美无缺?
- 注释第 7 行时第一个输出中的 cp 是什么?
- circular - dependency dropped 错误发生了什么?
我无法解释您如何看待您向我们展示的问题。要么你上面写的实际上不是你正在使用的,要么你有一个有问题的 GNU make 版本。我无法重现您所看到的行为。
但是,我确定它与此有关:GNU make 有一个 built-in 规则,知道如何从文件 xx
为任何 xx
:
# make -p -f/dev/null
...
%.out: %
# recipe to execute (built-in):
@rm -f $@
cp $< $@
如果您将自己的配方作为显式规则注释掉,那么 make 将在它知道的模式规则中搜索一个,它会找到这个 built-in 模式规则。
但是根据您向我们展示的内容,这条规则 不应该 匹配:为了使其与 a.out
的目标匹配,make 会查找或了解如何构建目标 a
,但似乎不可用。此外,了解如何构建 a
将显示对 a.out
.
如果您的 makefile 是:
TARGET = all.out
那么这一切都将变得非常有意义,因为您将拥有:
all : all.out
all.out : file1.o file2.o file3.o
并且在隐式规则匹配 %.out: %
之后它将像这样展开:
all : all.out
all.out : all file1.o file2.o file3.o
@rm -f all.out
cp all all.out
所以我假设当你将输出复制到你的问题时你改变了它:最好不要那样做。您应该 post 正是您所遇到的问题(并确认您仍然遇到 post 编辑的问题)。