Makefile GNU Make似乎跳过了先决条件 我有一个基本的最小的Mag文件来编译C++源代码;精简版本如下所示: TARGET = main OBJ = $(patsubst %.cpp,%.o,$(wildcard *.cpp)) CPPFLAGS = -std=c++11 -Wall build: $(TARGET) $(TARGET): $(OBJ) @echo "$? --> $@" g++ $(CPPFLAGS) -o $@ $? @echo %.o: %.cpp @echo "$< --> $@" g++ $(CPPFLAGS) -c $< @echo

Makefile GNU Make似乎跳过了先决条件 我有一个基本的最小的Mag文件来编译C++源代码;精简版本如下所示: TARGET = main OBJ = $(patsubst %.cpp,%.o,$(wildcard *.cpp)) CPPFLAGS = -std=c++11 -Wall build: $(TARGET) $(TARGET): $(OBJ) @echo "$? --> $@" g++ $(CPPFLAGS) -o $@ $? @echo %.o: %.cpp @echo "$< --> $@" g++ $(CPPFLAGS) -c $< @echo,makefile,gnu-make,Makefile,Gnu Make,更改一个源文件后,make将重建相应的目标文件,但由于某些原因,在尝试链接(clock.o-->main而不是clock.o main.o-->main)时跳过现有(未更改的)目标文件: 再次运行make时,在不更改任何文件的情况下,链接按预期工作: clock.cpp --> clock.o g++ -std=c++11 -Wall -c clock.cpp main.cpp --> main.o g++ -std=c++11 -Wall -c main.cpp clock.o

更改一个源文件后,
make
将重建相应的目标文件,但由于某些原因,在尝试链接(
clock.o-->main
而不是
clock.o main.o-->main
)时跳过现有(未更改的)目标文件:

再次运行
make
时,在不更改任何文件的情况下,链接按预期工作:

clock.cpp --> clock.o
g++ -std=c++11 -Wall -c clock.cpp

main.cpp --> main.o
g++ -std=c++11 -Wall -c main.cpp

clock.o main.o --> main
g++ -std=c++11 -Wall -o main clock.o main.o
clock.o main.o --> main
g++ -std=c++11 -Wall -o main clock.o main.o

这种行为的原因是什么,如何预防?


我在i686 Linux 4.4上运行GNU Make 4.1

您在
g++$(CPPFLAGS)-o$@$?
配方中使用了错误的自动变量。 :

$?

比目标更新的所有先决条件的名称, 它们之间有空格

所以Make完全按照您的要求执行:从所有更新的先决条件链接主目标,并跳过未触及的先决条件

g++$(CPPFLAGS)-o$@$^
recipe将解决此问题

clock.o main.o --> main
g++ -std=c++11 -Wall -o main clock.o main.o