Gcc 通过Makefile输出一些新行

Gcc 通过Makefile输出一些新行,gcc,makefile,Gcc,Makefile,下面是我的makefile: TARGET = prog LIBS = -lm CC = gcc CFLAGS = -pthread -Wextra -Wall -Wundef -Wshadow -Wpointer-arith -Wcast-align -Wstrict-prototypes -Wwrite-strings -Waggregate-return -Wcast-qual -Wswitch-default -Wswitch-enum -Wconversion -Wunreachabl

下面是我的makefile:

TARGET = prog
LIBS = -lm
CC = gcc
CFLAGS = -pthread -Wextra -Wall -Wundef -Wshadow -Wpointer-arith -Wcast-align -Wstrict-prototypes -Wwrite-strings -Waggregate-return -Wcast-qual -Wswitch-default -Wswitch-enum -Wconversion -Wunreachable-code

.PHONY: clean all default 

default: $(TARGET) clean 
all: default

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)

%.o: %.c $(HEADERS)
    $(CC) $(CFLAGS) -c $< -o $@

.PRECIOUS: $(TARGET) $(OBJECTS)

$(TARGET): $(OBJECTS)
    $(CC) $(OBJECTS) -Wall $(LIBS) -o $@

clean:
    -rm -f *.o
TARGET=prog
LIBS=-lm
CC=gcc
CFLAGS=-pthread-Wextra-Wall-Wundef-Wshadow-Wpointer arith-Wcast align-Wstrict原型-Wwrite strings-waggergate return-Wcast qual-Wswitch default-Wswitch enum-Wconversion-Wunreachable代码
.PHONY:清除所有默认值
默认值:$(目标)清除
全部:默认值
对象=$(patsubst%.c、%.o、$(通配符*.c))
标题=$(通配符*.h)
%.o:%.c$(标题)
$(CC)$(CFLAGS)-c$<-o$@
.珍贵:$(目标)$(对象)
$(目标):$(对象)
$(CC)$(对象)-墙$(LIBS)-o$@
清洁:
-rm-f*.o
使用上面的标志和目录中的一些文件,输出会使查找警告变得非常困难:


如何在每次调用GCC之间获得换行符?也许可以让警告更突出一些?

您可以使命令本身静音,并用更短的内容替换它

CPPFLAGS:=-MMD-MP
CFLAGS:=-pthread-Wextra-Wall-Wundef-Wshadow-Wpointer arith-Wcast align-Wstrict原型-Wwrite字符串-Waggregate返回-Wcast-qual-Wswitch默认值-Wswitch枚举-Wconversion-Wunreachable代码
LDLIBS:=-lm
对象:=$(patsubst%.c、%.o、$(通配符*.c))
deps:=$(对象:.o=.d)
.骗子:都是干净的
程序:$(对象)
$(LINK.o)$^$(LDLIBS)-o$@
%.o:%.c
@回声编译$<
@$(COMPILE.c)-o$@$<
清洁:$(RM)$(对象)$(deps)
-包括美元(deps)
还有几件事:

  • 更喜欢
    :=
    而不是
    =
  • LDLIBS
    是make内置配方中使用的库的标准变量
  • 将默认值
    CC
    设置为
    CC
    ,这应该是指向默认编译器的链接,您通常不需要设置
    CC
  • 您的
    默认值
    目标将破坏并行构建(
    -j
    ),我不会为此而烦恼
  • 此生成文件不需要
    all
    规则,只需将目标作为第一个规则即可
  • 注意使用
    通配符和源代码,手动指定它们通常更安全
  • 要使每个对象文件依赖于每个头,只需使用内置的依赖生成(
    -MMD-MP
    包含
  • make已经有了对象链接和编译的方法,请重用它们
  • 将默认值
    $(RM)
    设置为
    RM-f

类似于
@echo编译$@user657267的内容请登录并回答,这样您就可以获得一些积分。这是我找到的最干净、最简单的答案,谢谢。一个简单的补充:不要将
@
放在
$(COMPILE.c)
前面,你可以使用
$(Q)
,其中
$(Q)
通常解析为
@
,如果
$(V)
设置为1,则解析为空。这样,如果正在调试,可以键入
make V=1
查看完整的命令。