重新编译未修改的文件

时间:2016-06-03 08:02:28

标签: c++ makefile

我的程序有一个makefile,但是每次运行它都会重新编译,即使我什么也没修改。 每次运行errorPage.jsp时,它都会重新编译makesimHwIntf.cpp showHelp.cpp

这是我的make文件:

sendFromFile.cpp

每次shell中的输出都是:

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)/*

我已经搜索并阅读了这些内容:(How do I make Makefile to recompile only changed files?)但没有多大帮助。

有谁能帮我解决这个问题?

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

由于

3 个答案:

答案 0 :(得分:6)

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

@echo [triggered by changes in $?]

您还应该使用VPATH特殊变量,而不是在%.o目标中指定源路径。见GNU make VPATH documentation

答案 1 :(得分:3)

请尝试更换

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

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

答案 2 :(得分:0)

定义目标时,目录很重要。

如果定义规则

myexec: objdir/myexec.o
    $(CC) $(CFLAGS) -o bindir/myexec objdir/myexec.o $(LDFLAGS)

请相信这会在工作目录中创建文件myexec。当您重新运行时,找不到目标myexec,因此将再次创建它。添加目标中的路径,它应该可以工作。

尝试替换

BINARIES= main

BINARIES= $(BINDIR)/main

和规则

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

$(CC) $(CFLAGS) -o $@ $^ $(LDIR) $(LDLIBS)

同样改变其他规则。

注意,一般来说,在某些规则中创建目标时使用$ @与路径组合是一个坏主意(如$(BINDIR)/ $ @),因为这永远不会创建实际的目标文件。一个裸$ @就足够了。