Makefile 如何防止回声';将命令发送到控制台?

Makefile 如何防止回声';将命令发送到控制台?,makefile,Makefile,我将下面的Makefile与gnumake一起使用。如您所见,我在调用g++的行中预先添加了一个@,以防止它们被回送到控制台 但是,g++命令仍然是echo'ed。有人知道如何防止这种情况吗 对于C项目,我有一个几乎相同的Makefile,它工作正常 谢谢 # for portability. SHELL = /bin/sh CXX = g++ # compile flags. CXXFLAGS = -g -pedantic -Wall -Wextra -Werror -march

我将下面的Makefile与gnumake一起使用。如您所见,我在调用g++的行中预先添加了一个
@
,以防止它们被回送到控制台

但是,g++命令仍然是echo'ed。有人知道如何防止这种情况吗

对于C项目,我有一个几乎相同的Makefile,它工作正常

谢谢

# for portability.
SHELL   = /bin/sh
CXX     = g++

# compile flags.
CXXFLAGS = -g -pedantic -Wall -Wextra -Werror -march=native -O2 \
           -fwhole-program -flto

TARGET  = program
MANPAGE = program.8
SOURCES = $(shell echo src/*.cpp)
HEADERS = $(shell echo src/*.h)
OBJECTS = $(SOURCES:.cpp=.o)
VERSION = 0.1-beta

# installation paths.
PREFIX  = $(DESTDIR)/usr/local
BINDIR  = $(PREFIX)/sbin
MANDIR  = $(PREFIX)/share/man/man8

# standard targets.
all: $(TARGET)

$(TARGET): $(OBJECTS)
        @echo "[LD] $@"
        @$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJECTS)

man:
        @(cd man; gzip < $(MANPAGE) > $(MANPAGE).gz)

install: $(TARGET) man
        @install -D -m 755 $(TARGET) $(BINDIR)/$(TARGET)
        @install -D -m 744 man/$(MANPAGE).gz $(MANDIR)/$(MANPAGE).gz

install-strip: $(TARGET) man
        @install -D -m 755 -s $(TARGET) $(BINDIR)/$(TARGET)
        @install -D -m 744 man/$(MANPAGE).gz $(MANDIR)/$(MANPAGE).gz

uninstall:
        @$(RM) $(BINDIR)/$(TARGET)
        @$(RM) $(MANDIR)/$(MANPAGE).gz

clean:
        @$(RM) $(OBJECTS)

distclean: clean
        @$(RM) $(TARGET)
        @(cd man; $(RM) $(MANPAGE).gz)

%.o: %.cpp $(HEADERS)
        @echo "[CXX] $<"
        @$(CXX) $(CXXFLAGS) -c -o $@ $<

.PHONY: all man install install-strip uninstall clean distclean
#便于携带。
SHELL=/bin/sh
CXX=g++
#编译标志。
CXXFLAGS=-g-pedantic-Wall-Wextra-Werror-march=native-O2\
-FWHORE程序-flto
目标=程序
手册页=程序8
SOURCES=$(shell echo src/*.cpp)
标题=$(shell echo src/*.h)
对象=$(源:.cpp=.o)
版本=0.1-beta
#安装路径。
前缀=$(DESTDIR)/usr/local
BINDIR=$(前缀)/sbin
MANDIR=$(前缀)/共享/人/人8
#标准目标。
全部:$(目标)
$(目标):$(对象)
@回显“[LD]$@”
@$(CXX)$(CXXFLAGS)-o$(目标)$(对象)
男:
@(cd-man;gzip<$(手册页)>$(手册页).gz)
安装:$(目标)人
@安装-D-m 755$(目标)$(BINDIR)/$(目标)
@安装-D-m744man/$(MANPAGE).gz$(MANDIR)/$(MANPAGE.gz
安装条:$(目标)人
@安装-D-m 755-s$(目标)$(BINDIR)/$(目标)
@安装-D-m744man/$(MANPAGE).gz$(MANDIR)/$(MANPAGE.gz
卸载:
@$(RM)$(BINDIR)/$(目标)
@$(RM)$(MANDIR)/$(手册页).gz
清洁:
@$(RM)$(对象)
清洁:清洁
@$(RM)$(目标)
@(cd-man;$(RM)$(MANPAGE.gz)
%.o:%.cpp$(标题)

@echo“[CXX]$如果您提供了运行的实际命令和看到的错误输出示例(加上前后的几行上下文),那么这将非常有帮助

您是否同时看到
[CXX]src/xxx.cpp
和编译行?考虑到您提供的makefile,这是不可能的。如果您只看到编译行,这意味着make决定不使用您的模式规则,而是使用自己的内置模式规则。您需要使用
make-d
来了解make为什么放弃您的模式规则。


另外,您可以使用
$(通配符src/*.cpp)
而不是
$(shell echo src/*.cpp)
,并且在分配shell函数(或通配符或任何计算代价高昂的函数)的结果时,您应该始终使用
:=
而不是
=
除非有特定的原因推迟扩展。

您是否有
src/*.h
文件?如果没有,将优先使用.o文件的内置规则。使用
通配符
而不是
shell
可以解决此问题。使用
make-s
或添加一行
。SILENT:
将抑制的所有输出ode>make
。然而,领先的
@
标记也应该这样做。我个人不喜欢makefiles不显示或有机制显示正在执行的内容,因为当出现问题时很难调试。在这种情况下,我不定期使用
-s
。沉默:
.Thank@Banthar,我正在测试没有任何标题的Makefile!谢谢你的提示!:)