【问题标题】:makefile compiles all files instead of the last edited onesmakefile 编译所有文件而不是最后编辑的文件
【发布时间】:2016-10-03 16:53:15
【问题描述】:

请注意,关于 SO 也有类似的问题,但是我认为我的情况有所不同,而且我的 Makefile 非常简单明了。我是 Makefile 新手。

假设我需要编译一个项目,看起来像这样--

.
├── [4.0K]  bin
├── [ 517]  Makefile
├── [4.0K]  obj
└── [4.0K]  src
    ├── [ 117]  func1.cpp
    ├── [  76]  func2.cpp
    ├── [ 137]  global.h
    └── [  97]  main1.cpp

我的 Makefile 看起来像这样 --

CC          := g++
CFLAGS      := -g -Wall -std=c++0x
LDFLAGS     := -lm

NAMES   := func1.cpp func2.cpp main1.cpp
SRC     := $(addprefix src/,$(NAMES))
OBJ     := $(addprefix obj/,$(NAMES:.cpp=.o))
DEPS    := $(OBJ:.o=.d)

.PHONY: clean all debug

all: prog

debug:
    $(info $$SRC: ${SRC})
    $(info $$OBJ: ${OBJ})
    $(info $$DEPS: ${DEPS})

prog: bin/prog

bin/prog: $(OBJ)
    $(CC) $^ -o $@

$(OBJ): $(SRC)
    $(CC) $(CFLAGS) -I/src/global.h -c $(addprefix src/,$(notdir $(@:.o=.cpp))) -o $@

-include $(DEPS)

clean:
    rm -rf bin/*
    rm -rf obj/*

假设我打开了一个文件func1.cpp 并进行了一些更改。当我调用 make 时,它会编译所有文件,但它应该只编译一个 (func1.cpp)。

我该如何解决这个问题?

注意:我需要prog,bin/prog 的原因不同,我也不能像obj/%.o: src/%.c 这样的食谱,因为我可能有来自相同对象子集的不同目标.

【问题讨论】:

标签: c++ makefile


【解决方案1】:

当您编写如下规则时:

$(OBJ): $(SRC)
    cmd

在你的情况下是

obj/func1.o obj/func2.o obj/main.o : src/func1.cpp src/func2.cpp src/main1.cpp
    cmd

先决条件不会被压缩。这会为每个目标生成一个规则,其中包含所有先决条件。那就是:

obj/func1.o : src/func1.cpp src/func2.cpp src/main1.cpp
    cmd

obj/func2.o : src/func1.cpp src/func2.cpp src/main1.cpp
    cmd

obj/main.o : src/func1.cpp src/func2.cpp src/main1.cpp
    cmd

由于src/func1.cpp 是所有目标文件的先决条件,因此它们都会被重新编译。

您想要的是使用static pattern rule:

obj/%.o : src/%.cpp
    $(CC) $(CFLAGS) -I/src -c $< -o $@         

注意-I 用于包含目录,而不是包含文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 2019-04-07
    • 2012-10-18
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 2018-02-02
    相关资源
    最近更新 更多