【发布时间】:2018-04-10 22:23:42
【问题描述】:
这是我当前的makefile
CFLAGS = -Iheaders/
CC = g++
PROGRAM_NAME = sportsmanager
rwildcard = $(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))
SOURCES = $(call rwildcard,sources/,*.cpp)
OFILES = $(call rwildcard,obj-tmp/,*.o)
OBJDIR = obj-tmp/
compileAndRun:
make -s compile && make -s $(PROGRAM_NAME)
./$(PROGRAM_NAME)
compile: $(SOURCES)
mkdir -p $(OBJDIR)
$(CC) $(CFLAGS) -c $(SOURCES) && mv *.o $(OBJDIR)
$(PROGRAM_NAME): $(OFILES)
$(CC) $(CFLAGS) $(OFILES) -o $(PROGRAM_NAME)
每当我运行$ make 时,都会触发目标compile,它将目录sources/ 中的所有.cpp 文件编译为.o 文件,然后将这些文件移动到obj-tmp/。然后触发目标$(PROGRAM_NAME),链接所有.o文件,输出可执行文件。
问题是每次我运行make 时都会编译所有 文件。如果我连续两次运行“make”,理想情况下应该发生的是,make 应该知道该程序第二次是最新的。如果我只修改一个文件,则只应编译该文件。
请注意:我知道存在与此相关的类似问题,但我还没有看到与上述 makefile 结合使用的解决方案。
非常感谢任何输入。
【问题讨论】:
-
你的命令明确告诉它编译每个文件——这是不可能的。您需要告诉 make 如何 编译单个文件(使用 % 规则),设置依赖关系,它会神奇地做正确的事情。
-
不要复制 .o 文件 - 将它们创建在您要放置它们的目录中。这是一个非常糟糕的 makefile。
-
不要垃圾标签。并阅读
make的文档。很全面。