【发布时间】:2017-02-12 21:47:41
【问题描述】:
我有一个基本的、最小的 makefile 来编译 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
从头开始构建时,一切都按预期工作:
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
在其中一个源文件发生更改后,make 会重建相应的目标文件,但由于某种原因在尝试链接时会跳过现有(未更改的)目标文件(clock.o --> main 而不是clock.o main.o --> main):
clock.cpp --> clock.o
g++ -std=c++11 -Wall -c clock.cpp
clock.o --> main
g++ -std=c++11 -Wall -o main clock.o
再次运行make 时,不更改任何文件,链接按预期工作:
clock.o main.o --> main
g++ -std=c++11 -Wall -o main clock.o main.o
这种行为的原因是什么,如何预防?
我在 i686 Linux 4.4 上运行 GNU Make 4.1
【问题讨论】: