makefile没有构建程序的更新部分 - C ++

时间:2009-04-24 04:03:52

标签: c++ makefile

我是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

4 个答案:

答案 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可以看到它们。