说我有以下生成文件没有指定命令:make执行在makefile
TARGETS = a b c
all: $(TARGETS)
@echo Done.
%.o: %.cpp
@echo Compiling [email protected]
touch [email protected]
%: %.o
@echo Building [email protected]
touch [email protected]
我预计,这应该没有问题,运行:all
规则将触发%
,规则,可能会触发%.o
规则,生成a.o
,b.o
和c.o
文件,然后最终生成a
,b
和c
文件。
但是,在运行make
导致以下的输出:
[email protected]:~/Downloads$ make
g++ a.cpp -o a
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/../../../crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [a] Error 1
为什么我试图运行g++
所有的突然?我对此没有规定。另外,运行make a.o
,然后make a
工作正常,但运行make a
会导致上述行为。
我该怎么做才能防止make
“想出”它认为适合目标的命令?
这很酷!但是,请您解释一下您的解决方案中发生了什么,以及它为什么可行,而不是我的解决方案? – gablin
其实我没有解释为什么“%:%o”规则被忽略。但是,如果将其替换为“%.exe:%o”(与每个目标名称一起),它就可以工作!我的解决方案为每个目标(使用define..endef)定义了一个通用规则,并且$(foreach ..,$(eval ..))宏将其扩展为目标的每个元素(请参阅http:// www .gnu.org /软件/制作/手动/ make.html#EVAL-功能)。 – Francois
...并回答你最初的问题,因为“%:%.o”规则被忽略,使得它回到它的C++隐式编译规则上(参见http://www.gnu.org/software/make/manual /make.html#Catalogue-of-Rules),这就是令人惊讶的g ++调用的来源。 – Francois