【问题标题】:Make : delete target before making targetMake :在制作目标之前删除目标
【发布时间】:2014-10-19 12:32:56
【问题描述】:

这不起作用:

CXXFLAGS =  -O2 -g -Wall -fmessage-length=0
OBJS =      src\Sfe.cpp
LIBS =
TARGET =      Sfe.exe

$(TARGET):  $(OBJS)
    rm -f $(TARGET)
    $(CXX) -o $(TARGET) $(OBJS) $(LIBS)

all: $(TARGET)
clean: rm -f $(OBJS) $(TARGET)

但这有效:

OBJS =      src\Sfe.cpp
LIBS =
TARGET =      Sfe.exe

$(TARGET):  $(OBJS)
    $(CXX) -o $(TARGET) $(OBJS) $(LIBS)

all: 
    rm -f $(TARGET)
    $(CXX) -o $(TARGET) $(OBJS) $(LIBS)
clean: rm -f $(OBJS) $(TARGET)

我想在编译一个新的之前删除 Sfe.exe。 为什么第一种方式不起作用? 它总是用 make 来回答:Nothing to be done for `all'。

【问题讨论】:

    标签: makefile rm


    【解决方案1】:

    make 只重建需要重建的东西。它根据目标的先决条件的时间戳确定。在您的第一个示例中,$(OBJS) 中的文件可能已经比$(TARGET) 中的二进制文件旧,因此 make 认为它没有任何关系。

    在您的第二个示例中,all 目标没有先决条件,因此始终被视为需要构建。

    更好的解决方案可能是在第一个示例中将$(TARGET) 目标设置为.PHONY(有关虚假目标的更多信息,请参阅GNU Make Manual 的this section)。

    或者,您可以使用force target 来执行类似的任务(但没有.PHONY 的一些副作用)。有关更多信息,请参阅 GNU Make 手册的this section

    【讨论】:

    • 谢谢伊坦。以下是真的吗:?在 $(TARGET) : $(OBJ) 下,您只有处理更新 $(OBJ) 而不是 $(TARGET) 的规则?
    • 罢工吧。我找到了。您必须更改 Sfe.cpp 的内部以使时间戳指示 Sfe.cpp 是!更老,因此更新鲜!比 Sfe.exe。当是这种情况时! $(TARGET) : $(OBJS) 下的所有东西都被执行。
    • 如果任何先决条件被认为是更新的,正确的,则重新构建目标。不,目标应该始终构建目标的确切文件名。为此目的使用$@ 通常是一个好主意。是的,您始终可以强制先决条件更新,或者您可以使用答案中的方法来做类似的事情,而无需更改任意先决条件文件的修改时间。
    猜你喜欢
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多