在我理想的解决方案中,我想要一个基于 SAN 变量设置清理程序的 Makefile,仅当我调用目标“调试”时,并注意,像现在一样,gcc 不支持 -fsanitize=memory,因此仅当 CC 时才通过=叮当声
第一次尝试是:
...
CC=gcc # gcc|clang
CFLAGS=-Wall -O2
SAN?=address # address|thread|memory
all:
$(CC) $(CFLAGS) $^ $(LDFLAGS) -o $(BIN)
debug: all
CFLAGS+=-g -fsanitize=undefined
LDFLAGS+=-fsanitize=undefined
ifeq ($(SAN),address)
CFLAGS+=-fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined
LDFLAGS+=-fsanitize=address -fsanitize=undefined
endif
ifeq ($(SAN),thread)
CFLAGS+=-fsanitize=thread
LDFLAGS+=-fsanitize=thread
endif
ifeq ($(SAN),memory)
ifeq ($(CC),clang)
CFLAGS+=-fsanitize=memory -fPIE -fno-omit-frame-pointer -fsanitize-memory-track-origins
LDFLAGS+=-fsanitize=memory -fPIE -pie
endif
endif
但不起作用。
然后我尝试一些更简单的没有 SAN 变量的方法,例如:
CC=gcc
CFLAGS=-Wall -O2
debug: CFLAGS+=-g -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined
debug: LDFLAGS+=-fsanitize=address -fsanitize=undefined
debug: all
ifeq ($(CC),clang)
CFLAGS+=-fsanitize=memory -fPIE -fno-omit-frame-pointer -fsanitize-memory-track-origins
LDFLAGS+=-fsanitize=memory -fPIE -pie
endif
但还是不行。
这样做,但它真的太简单了:
debug: CFLAGS+=-g -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined
debug: LDFLAGS+=-fsanitize=address -fsanitize=undefined
debug: all
建议?
您没有说出“它不起作用”的实际含义。 请显示您调用的命令,并剪切并粘贴您遇到的错误。 此外,提供您正在使用的 GNU Make 版本以及您正在构建的操作系统也会很有帮助。
您是否想象通过在像
debug: all
这样的目标后面缩进一些行,这些行会进行仅与目标debug
相关的变量赋值? make 根本不是这样工作的。 要了解 makefile 语法,您可以阅读文档。
这个:
debug: all
CFLAGS+=-g -fsanitize=undefined
LDFLAGS+=-fsanitize=undefined
与写作完全一样(就制作而言):
CFLAGS+=-g -fsanitize=undefined
LDFLAGS+=-fsanitize=undefined
debug: all
(或任何其他组合)。 当然,假设这里的缩进只是空格,而不是制表符:从你的问题中不清楚。 如果您向我们展示了您遇到的错误,那就很清楚了,因为这些行不是有效的 shell 脚本行。
做你想做的事情的一个选择是:
CFLAGS_address = -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined
LDFLAGS_address = -fsanitize=address -fsanitize=undefined
CFLAGS_thread = -fsanitize=thread
LDFLAGS_thread = -fsanitize=thread
ifeq ($(CC),clang)
CFLAGS_memory = -fsanitize=memory -fPIE -fno-omit-frame-pointer -fsanitize-memory-track-origins
LDFLAGS_memory = -fsanitize=memory -fPIE -pie
endif
debug: CFLAGS += -g -fsanitize=undefined $(CFLAGS_$(SAN))
debug: LDFLAGS += -fsanitize=undefined $(LDFLAGS_$(SAN))
debug: all