我设计了一个Makefile,它可以单独编译所有的。c文件并分别生成一个。o文件(我认为这是隐式发生的,并且工作得很好)。
可执行文件(.out)不是从。o文件生成的。
Makefile:
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 all.out
注意:如果行号为0,Makefile将完美地工作并产生完美的结果。
行不。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
我是新手。
查询:
- 为什么注释行没有。7造成这个问题,并取消评论工作完美?
- 什么是cp在第一个输出中当行号为。7被评论了?
- 为什么循环依赖被删除的意思吗?
我无法解释你是如何看待你向我们展示的问题的。要么你上面写的不是你实际使用的,要么你有一个有bug的GNU make版本。我无法重现你所看到的行为。
但是,我确信它与此有关:GNU make有一个内置规则,知道如何从文件xx
为任何xx
构建xx.out
文件:
# make -p -f/dev/null
...
%.out: %
# recipe to execute (built-in):
@rm -f $@
cp $< $@
如果你注释了你自己的食谱作为一个显式规则,那么make将在它知道的模式规则中搜索一个,它将找到这个内置的模式规则。
然而,这个规则不应该匹配基于您向我们展示的内容:为了使它与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
所以我假设当你把输出复制到你的问题时,你改变了它:最好不要这样做。您应该准确地发布您所遇到的问题(并验证您仍然存在您所发布的问题)。