Gcc 通过Makefile输出一些新行
下面是我的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
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)
还有几件事:
- 更喜欢
而不是:=
=
是make内置配方中使用的库的标准变量LDLIBS
- 将默认值
设置为CC
,这应该是指向默认编译器的链接,您通常不需要设置CC
CC
- 您的
目标将破坏并行构建(默认值
),我不会为此而烦恼-j
- 此生成文件不需要
规则,只需将目标作为第一个规则即可all
- 注意使用
通配符和源代码,手动指定它们通常更安全
- 要使每个对象文件依赖于每个头,只需使用内置的依赖生成(
,-MMD-MP
)包含
- make已经有了对象链接和编译的方法,请重用它们
- 将默认值
设置为$(RM)
RM-f
@echo编译$@user657267的内容请登录并回答,这样您就可以获得一些积分。这是我找到的最干净、最简单的答案,谢谢。一个简单的补充:不要将@
放在$(COMPILE.c)
前面,你可以使用$(Q)
,其中$(Q)
通常解析为@
,如果$(V)
设置为1,则解析为空。这样,如果正在调试,可以键入make V=1
查看完整的命令。