我的程序有一个makefile,但是每次运行它都会重新编译,即使我什么也没修改。
每次运行errorPage.jsp
时,它都会重新编译make
和simHwIntf.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时可能会重新创建一个或多个目录,这会导致内部的所有内容看起来像编译器的新内容。
由于
答案 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)/ $ @),因为这永远不会创建实际的目标文件。一个裸$ @就足够了。