2016-11-22 62 views
2

下面是我的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 -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 [email protected] 

.PRECIOUS: $(TARGET) $(OBJECTS) 

$(TARGET): $(OBJECTS) 
    $(CC) $(OBJECTS) -Wall $(LIBS) -o [email protected] 

clean: 
    -rm -f *.o 

通过上面的标志和几个目录中的文件,输出使它很难找到警告:

enter image description here

如何在每次致电GCC之间获得换行符?也许会让警告更突出一点?

+0

像'@echo编译$ <; @ $(CC)$(CFLAGS)-c $ <-o $ @;'? – user657267

+0

@ user657267请登录并提出答案,以便获得一定的功劳。这是我找到的最干净,最简单的答案,谢谢。 – 8protons

回答

1

你可以沉默命令本身,并用短的东西代替它。

CPPFLAGS := -MMD -MP 
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 
LDLIBS := -lm 

objects := $(patsubst %.c, %.o, $(wildcard *.c)) 
deps := $(objects:.o=.d) 

.PHONY: all clean 

prog: $(objects) 
    $(LINK.o) $^ $(LDLIBS) -o [email protected] 

%.o: %.c 
    @echo Compiling $< 
    @$(COMPILE.c) -o [email protected] $< 

clean: ; $(RM) $(objects) $(deps) 

-include $(deps) 

一些其他的东西:

  • 不想:==
  • LDLIBS是图书馆的标准变量作为make的使用内置的食谱
  • 使默认CCcc,这应该是你的默认编译器的链接,你通常不需要设置CC
  • default目标将突破并行编译(-j),我不会打扰它
  • 这个文件也不需要一个all规则,只要使目标的第一条规则
  • 小心与wildcard和来源,它通常是更安全的手动指定它们
  • 你让每个目标文件依赖于每一个标题,只需使用内置depedency代代替(-MMD -MPinclude
  • 化妆已经为对象链接和编制食谱,重用他们
  • 使默认$(RM)rm -f
+0

快速添加:可以使用'$(Q)',而不是在$(COMPILE.c)之前放置@,而$(Q)'通常会解析为'@'或者如果$(V)'设置为1,则为空。这样,如果您正在调试,则可以键入'make V = 1'来查看完整的命令。 – user2766918