我是makefiles的新手并且面临一些问题.我创建了以下makefile.它工作正常.但是当我修改main.cpp并运行make时,它会说"一切都是最新的".我需要做一个make clean并再次运行make,一切都会正常工作.
看起来这个makefile存在一些问题,我无法弄清楚它出错的地方.任何人都可以帮我找出这个makefile中的错误在哪里以及它为什么不构建更改的文件?
#Main makefile which does the build
CFLAGS =
CC = g++
PROG = fooexe
#each module will append the source files to here
SRC :=
#including the description
include foo/module.mk
OBJ := $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC))) main.o
#linking the program
fooexe: $(OBJ)
$(CC) -o $(PROG) $(OBJ)
%.o:
$(CC) -c $(SRC) -o $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC)))
main.o:
$(CC) -c main.cpp
depend:
makedepend -- $(CFLAGS) -- $(SRC)
.PHONY:clean
clean:
find . -name "*.o" | xargs rm -vf
rm -vf fooexe
Run Code Online (Sandbox Code Playgroud)
通常,.o文件需要依赖于相应的.cpp文件.我认为这是语法,但不是100%肯定:
%.o : %.cpp
$(CC) ...
main.o : main.cpp
$(CC) ...
Run Code Online (Sandbox Code Playgroud)
%.o:
$(CC) -c $(SRC) -o $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC)))
Run Code Online (Sandbox Code Playgroud)
这是一个模式规则,它告诉make,"只要.o文件是必需的且不存在,$(CC)就在所有.cpp文件中运行$(SRC)." 它不会在.cpp文件更改时重新编译,因为它没有列出任何先决条件.如果所需的.o文件已存在,那么make没有理由执行该$(CC)命令.
如果您将第一行更改%.o: %.cpp为Andy White建议的那么,则更新的规则现在告诉make,"只要.o文件是必需的且不存在或者比相应的.cpp文件旧,就运行$(CC)所有.cpp文件$(SRC)."
这样做更好,但仍然存在一个问题:更新后的规则始终会编译所有.cpp文件,甚至是最新的文件.要解决此问题,规则的命令部分需要将正确的.cpp文件重新编译为正确的.o文件.您可以使用自动变量(例如$<(第一个先决条件)和$@(目标))来执行此操作:
%.o: %.cpp
$(CC) -c $< -o $@
Run Code Online (Sandbox Code Playgroud)
在GNU Make使用手册有更多的解释和细节.