我是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
答案 0 :(得分:5)
通常,.o文件需要依赖于相应的.cpp文件。我认为这是语法,但不是100%肯定:
%.o : %.cpp
$(CC) ...
main.o : main.cpp
$(CC) ...
答案 1 :(得分:5)
%.o:
$(CC) -c $(SRC) -o $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC)))
这是一个模式规则,告诉make,“只要.o
文件是必需的且不存在,就在$(CC)
中的所有.cpp
文件上运行$(SRC)
“。它在更改时不会重新编译.cpp
文件,因为它没有列出任何先决条件。如果已存在所需的.o
文件,那么make没有理由执行$(CC)
命令。
如果您将第一行更改为%.o: %.cpp
,正如Andy White建议的那样,那么更新的规则现在告诉make,“只要.o文件是必需的且不存在或者比相应的{{1}更旧} {file},对.cpp
中的所有$(CC)
文件运行.cpp
。“
这样做更好,但仍然存在问题:更新的规则始终会编译所有$(SRC)
个文件,甚至是最新的文件。要解决此问题,规则的命令部分需要将正确的.cpp
文件重新编译为正确的.cpp
文件。您可以使用自动变量执行此操作,例如.o
(第一个先决条件)和$<
(目标):
$@
GNU Make Manual有更多解释和详细信息。
答案 2 :(得分:1)
使用main.cpp的规则 - main.o - 没有为main.o指定依赖的内容。你需要该行至少是“main.o:main.cpp”,以及main.o所依赖的任何其他源文件。
我看到你使用makedepend得到了一个依赖规则;你正确使用它吗?我自己没有使用它,但我总是用以下内容结束我的makefile:
depend:
mv Makefile Makefile.bak
sed '/^#DO NOT DELETE THIS LINE$$/,$$d' Makefile.bak > Makefile
echo '#DO NOT DELETE THIS LINE' >> Makefile
echo '#' >> Makefile
$(CC) -MM *.c >> Makefile
#
#DO NOT DELETE THIS LINE
#
然后,当我运行“make depend”时,我得到如下行:
main.o: main.c main.h otherstuff.h
otherstuff.o: otherstuff.c otherstuff.h
答案 3 :(得分:0)
启用调试后运行make,看看你得到了什么。
Make是如此古老的代码,以至于它确实在做它想要的东西。
你使用find找到.o文件的事实让我觉得你有真实的子目录;如果是这样,你需要确保Make可以看到它们。