C Makefile忽略@to静默输出

C Makefile忽略@to静默输出,c,makefile,C,Makefile,我有一个Makefile: CC = @gcc RM = @rm TARGET = test PLUGINS_DIR = plugins PLUGINS_C = $(wildcard $(PLUGINS_DIR)/*.c) PLUGINS_O = $(patsubst %.c,%.o, $(PLUGINS_C)) PLUGINS_SO = $(patsubst %.c,%.so, $(PLUGINS_C))

我有一个Makefile:

CC          =   @gcc
RM          =   @rm

TARGET      =   test
PLUGINS_DIR =   plugins
PLUGINS_C   =   $(wildcard $(PLUGINS_DIR)/*.c)
PLUGINS_O   =   $(patsubst %.c,%.o, $(PLUGINS_C))
PLUGINS_SO  =   $(patsubst %.c,%.so, $(PLUGINS_C))

.PHONY: plugins

new: clean all

all: $(TARGET) $(PLUGINS_SO)

$(TARGET): $(TARGET).o
    $(CC) -o $@ $^ -g -Wall -std=gnu99 -ldl -Wl,--export-dynamic

$(PLUGINS_DIR)/%.so: $(PLUGINS_DIR)/%.o
    $(CC) $^ -o $@ -shared

$(PLUGINS_DIR)/%.o: $(PLUGINS_DIR)/%.c
    $(CC) -c $< -o $@ -pedantic -g -Wall -std=c99 -fpic -I.

clean:
    $(RM) -rf $(TARGET) *.o *.a $(PLUGINS_O) $(PLUGINS_SO)
CC=@gcc
RM=@RM
目标=测试
PLUGINS\u DIR=插件
PLUGINS\u C=$(通配符$(PLUGINS\u DIR)/*.C)
PLUGINS\u O=$(patsubst%.c,%.O,$(PLUGINS\u c))
PLUGINS\u-SO=$(patsubst%.c,%.SO,$(PLUGINS\u-c))
.假冒:插件
新:清洁所有
全部:$(目标)$(插件)
$(目标):$(目标)。o
$(CC)-o$@$^-g-Wall-std=gnu99-ldl-Wl,--导出动态
$(插件目录)/%。所以:$(插件目录)/%。o
$(CC)$^-o$@-共享
$(插件目录)/%.o:$(插件目录)/%.c
$(CC)-c$<-o$@-pedantic-g-Wall-std=c99-fpic-I。
清洁:
$(RM)-rf$(目标)*.o*.a$(插件\u o)$(插件\u SO)
但是
clean
仍在输出消息!(
rm插件/tt.o插件/kk.o
) 如果我删除
rm
前面的
@
,那么除了第一条消息之外,我还会收到另一条消息:
rm-rf test*.o*.a plugins/kk.o plugins/tt.o plugins/kk.so plugins/tt.so

如何使
完全静音?(请不要使用
make
开关,只需在Makefile中进行编码)


编辑:使用Make4.0,我想你弄错了;我敢打赌这不是你的规矩

这些对象文件被视为“中间目标”,因此make会自动为您删除它们。当它这样做时,它会打印这些信息,这样你就知道他们去了哪里。阻止这种情况发生的唯一方法是定义
.SILENT:
特殊目标(或者给出
-s
标志,但您说不想这样做)

或,你可以确保制作不考虑这些文件是中间的(因此不删除它们),列出它们作为先决条件,也许:

all: $(TARGET) $(PLUGINS_SO) $(PLUGINS_O)

我想你搞错了;我敢打赌这不是你的规矩

这些对象文件被视为“中间目标”,因此make会自动为您删除它们。当它这样做时,它会打印这些信息,这样你就知道他们去了哪里。阻止这种情况发生的唯一方法是定义
.SILENT:
特殊目标(或者给出
-s
标志,但您说不想这样做)

或,你可以确保制作不考虑这些文件是中间的(因此不删除它们),列出它们作为先决条件,也许:

all: $(TARGET) $(PLUGINS_SO) $(PLUGINS_O)

我想你搞错了;我敢打赌这不是你的规矩

这些对象文件被视为“中间目标”,因此make会自动为您删除它们。当它这样做时,它会打印这些信息,这样你就知道他们去了哪里。阻止这种情况发生的唯一方法是定义
.SILENT:
特殊目标(或者给出
-s
标志,但您说不想这样做)

或,你可以确保制作不考虑这些文件是中间的(因此不删除它们),列出它们作为先决条件,也许:

all: $(TARGET) $(PLUGINS_SO) $(PLUGINS_O)

我想你搞错了;我敢打赌这不是你的规矩

这些对象文件被视为“中间目标”,因此make会自动为您删除它们。当它这样做时,它会打印这些信息,这样你就知道他们去了哪里。阻止这种情况发生的唯一方法是定义
.SILENT:
特殊目标(或者给出
-s
标志,但您说不想这样做)

或,你可以确保制作不考虑这些文件是中间的(因此不删除它们),列出它们作为先决条件,也许:

all: $(TARGET) $(PLUGINS_SO) $(PLUGINS_O)


我没有收到你的Makefile的任何消息。(GNU make 3.81)@OlafDietsche我在make 4.0上.o文件的rm正在删除中间文件。没有运行rm命令。你需要告诉make不要那样做以避免那个消息。请参阅疯狂科学家的答案,以了解如何做到这一点。另一种方法是使用.PRECIOUS。我不会使用
.PRECIOUS
。这还有其他你可能不想要的副作用。我在你的Makefile中没有收到任何消息。(GNU make 3.81)@OlafDietsche我在make 4.0上.o文件的rm正在删除中间文件。没有运行rm命令。你需要告诉make不要那样做以避免那个消息。请参阅疯狂科学家的答案,以了解如何做到这一点。另一种方法是使用.PRECIOUS。我不会使用
.PRECIOUS
。这还有其他你可能不想要的副作用。我在你的Makefile中没有收到任何消息。(GNU make 3.81)@OlafDietsche我在make 4.0上.o文件的rm正在删除中间文件。没有运行rm命令。你需要告诉make不要那样做以避免那个消息。请参阅疯狂科学家的答案,以了解如何做到这一点。另一种方法是使用.PRECIOUS。我不会使用
.PRECIOUS
。这还有其他你可能不想要的副作用。我在你的Makefile中没有收到任何消息。(GNU make 3.81)@OlafDietsche我在make 4.0上.o文件的rm正在删除中间文件。没有运行rm命令。你需要告诉make不要那样做以避免那个消息。请参阅疯狂科学家的答案,以了解如何做到这一点。另一种方法是使用.PRECIOUS。我不会使用
.PRECIOUS
。这还有其他你可能不想看到的副作用。明确地说,
makeclean
不会打印这一行,因为它不会构建这些目标,所以不会删除它们。它只由
makeall
打印。是的,就是这样:)说清楚点,
makeclean
不会打印那一行,因为它不会生成那些目标,所以不会删除它们。它只由
makeall
打印。是的,就是这样:)说清楚点,
makeclean
不会打印那一行,因为它不会生成那些目标,所以不会删除它们。它只由
makeall
打印。是的,就是这样:)说清楚点,
makeclean
不会打印那一行,因为它不会生成那些目标,所以不会删除它们。它只由
makeall
打印