我有以下Makefile
。出于某种原因,当我执行make
时,即使我没有修改文件,它也会重建目标test_phantom_types.o
。
GTEST_HEADERS = ${GTEST_DIR}/include/gtest/*.h \
${GTEST_DIR}/include/gtest/internal/*.h
BASE_DIR = ..
BUILD_DIR = build
USER_DIR = $(BASE_DIR)/tests/src
CPPFLAGS += -isystem $(GTEST_DIR)/include
CXXFLAGS += -g -Wall -Wextra -pthread -std=c++11
TESTS = test_phantom_types
all : $(TESTS)
clean :
cd $(BUILD_DIR); \
rm -rf $(BUILD_DIR)/*.o; \
cd ../
test_phantom_types.o : $(USER_DIR)/test_phantom_types.cpp \
$(BASE_DIR) $(GTEST_HEADERS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(BASE_DIR) -c $(USER_DIR)/test_phantom_types.cpp -o $(BUILD_DIR)/$@
test_phantom_types : test_phantom_types.o
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $(addprefix $(BUILD_DIR)/,$^) ${GTEST_DIR}/libgtest.a ${GTEST_DIR}/libgtest_main.a -o $(addprefix $(BUILD_DIR)/, $@)
check : $(TESTS)
./$(addprefix $(BUILD_DIR)/,$^)
.PHONY : clean
答案 0 :(得分:2)
make非常直观。
你告诉它你有一个名为test_phantom_types.o
的目标,所以它希望该目标生成该文件。
但是,在你的情况下,它并没有。它会生成$(BUILD_DIR)/$@
(来自-o $(BUILD_DIR)/$@
)并且这不是一回事。
因此,当您运行make
并确定(来自all
- > test_phantom_types
- > test_phantom_types.o
序列)时,需要检查是否需要构建它要查找的test_phantom_types.o
文件,无法找到并重建它。
如果您尝试,可以在make -d
的输出中看到此内容。
这就是第二个Rule of Makefiles
的原因2.每个非.PHONY规则必须使用其目标的确切名称更新文件。
确保每个命令脚本都接触文件“$ @” - 而不是“../$@”或“$(notdir $ @)”,但确切地说是$ @。这样你和GNU总是同意。