重新编译未修改的文件

Pab*_*Mon 4 c++ makefile

我有一个makefile用于我的程序,但每次运行它都会重新编译,即使我没有修改任何内容.每次我运行make它重新编译simHwIntf.cpp showHelp.cppsendFromFile.cpp

这是我的make文件:

IDIR    = inc
LDIR    = -L/usr/lib/x86_64-linux-gnu/
SDIR    = src
ODIR    = obj
BINDIR  = bin
LDLIBS  = -luhd
OBJ     = $(patsubst %,$(ODIR)/%,$(O_FILES))

CC      = g++
CFLAGS  = -Wall -std=c++11 -I $(IDIR) #-Werror

BINARIES= main

C_FILES = simHwIntf.cpp showHelp.cpp  sendFromFile.cpp
H_FILES = simHwIntf.h
O_FILES = $(C_FILES:.cpp=.o)

all: $(BINARIES)
@echo "Make file executed"

$(BINARIES): $(O_FILES)
$(CC) $(CFLAGS) -o $(BINDIR)/$@ $(OBJ) $(LDIR) $(LDLIBS) 

fileCreator: fileCreator.o 
$(CC) $(CFLAGS) -o $(BINDIR)/$@ $(ODIR)/fileCreator.o

fileHandler: fileHandler.o
$(CC) $(CFLAGS) -o $(BINDIR)/$@ $(ODIR)/fileHandler.o

backYard: backYard.o
$(CC) $(CFLAGS) -o $(BINDIR)/$@ $(ODIR)/backYard.o

%.o: $(SDIR)/%.cpp $(IDIR)/$(H_FILES)
$(CC) $(CFLAGS) -c -o $(ODIR)/$@ $<

clean: 
-rm -rf $(ODIR)/*.o *~

distclean: clean
-rm -rf $(BINDIR)/*
Run Code Online (Sandbox Code Playgroud)

每次shell中的输出是:

g++ -Wall -std=c++11 -I inc  -c -o obj/simHwIntf.o src/simHwIntf.cpp
g++ -Wall -std=c++11 -I inc  -c -o obj/showHelp.o src/showHelp.cpp
g++ -Wall -std=c++11 -I inc  -c -o obj/sendFromFile.o src/sendFromFile.cpp
g++ -Wall -std=c++11 -I inc  -o bin/main obj/simHwIntf.o obj/showHelp.o obj/sendFromFile.o -L/usr/lib/x86_64-linux-gnu/ -luhd 
Make file executed
Run Code Online (Sandbox Code Playgroud)

我已经搜索并阅读了这个:( 如何使Makefile重新编译只有更改的文件?)但没有多大帮助.

有谁可以帮我一个忙吗?

我对目录有疑问,每次运行make时可能会重新创建一个或多个目录,这会导致内部的所有内容看起来像编译器的新内容.

谢谢

Tim*_*Tim 6

您可以通过回显更改的依赖项来查看触发构建的内容.将其添加到%.o目标:

@echo [triggered by changes in $?]
Run Code Online (Sandbox Code Playgroud)

您还应该使用VPATH特殊变量,而不是在%.o目标中指定源路径.请参阅GNU make VPATH文档