c++ - 重新编译未修改的文件

标签 c++ makefile

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

这是我的制作文件:

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

每次在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

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

有人可以帮我解决这个问题吗?

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

谢谢

最佳答案

您可以通过回显更改的依赖项来查看是什么触发了构建。将此添加到您的 %.o 目标:

@echo [triggered by changes in $?]

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

关于c++ - 重新编译未修改的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37609084/

相关文章:

Docker 构建 : the command returned a non-zero code: 141

c++ - Linux 中的 OpenCV:无法获取 Mat 大小(cv::Size),仅返回 MSize

c++ - 为什么 SFINAE (enable_if) 不适用于类模板的成员函数?

c++ - 如何在 C++ 中快速计算 vector 的归一化 l1 和 l2 范数?

c++ - 使用 zlib 优化文件写入?

c - 尝试制作一个简单的 Makefile 失败

c++ - 跨平台构建库而不运行所有平台

c++ - 如何保留对我在堆上创建的对象的指针的全局访问

c - Makefile 依赖项和时间戳

makefile - 隐式 Makefile 目标