說我有以下生成文件沒有指定命令: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