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

Nav*_*K N 1 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
Run Code Online (Sandbox Code Playgroud)

And*_*ite 5

通常,.o文件需要依赖于相应的.cpp文件.我认为这是语法,但不是100%肯定:

%.o : %.cpp
    $(CC) ...

main.o : main.cpp
    $(CC) ...
Run Code Online (Sandbox Code Playgroud)


bk1*_*k1e 5

%.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使用手册有更多的解释和细节.