如何通过模式特定变量为GNU Makefile通用模式规则添加调试编译标志
问题解决:Makefile模式特定变量实现调试版编译
你的问题出在debug_%: %这个规则的设计上——模式特定变量仅作用于debug_%目标自身的规则,而不是它所依赖的%目标规则。当你执行make debug_test_function1时,Make找不到直接生成debug_test_function1的规则,只会尝试依赖已有的test_function1目标,而该目标的编译不会继承debug_%的CFLAGS。
正确的实现方式
修改Makefile,给debug_%编写独立的模式规则,直接关联对应的源文件,并通过模式特定变量追加调试选项:
TEST_SRCS = ${wildcard *.c} TEST_EXECS = ${TEST_SRCS:.c=} DEBUG_TEST_EXECS = $(addprefix debug_, $(TEST_EXECS)) PROJECT_PATH = ../my_project CFLAGS = -Wall -Wextra -Werror # 普通版编译规则 %:: %.c ${PROJECT_PATH}/libmyproject.a gcc ${CFLAGS} $< -L${PROJECT_PATH} -lmyproject -o $@ # 调试版编译规则:模式特定变量仅作用于该规则 debug_%: CFLAGS += -g debug_%: %.c ${PROJECT_PATH}/libmyproject.a gcc ${CFLAGS} $< -L${PROJECT_PATH} -lmyproject -o $@ all: ${TEST_EXECS} # 新增:生成所有调试版二进制 debug_all: ${DEBUG_TEST_EXECS} clean: rm -f ${TEST_EXECS} ${DEBUG_TEST_EXECS} re: clean all # 新增:重新生成所有调试版 debug_re: clean debug_all .PHONY: all clean re debug_all debug_re
关键说明
- 模式规则匹配:
debug_%中的%会匹配debug_后的部分(比如debug_test_function1的%是test_function1),对应的源文件就是%.c即test_function1.c,直接关联到你的测试文件。 - 模式特定变量生效:
debug_%: CFLAGS += -g仅会在编译debug_%目标时给CFLAGS追加-g,不会影响普通版的编译规则。 - 扩展功能:新增
debug_all和debug_re目标,方便批量生成或重新生成所有调试版测试程序,同时clean规则也会清理调试版二进制。
现在执行make debug_test_function1就能生成带调试符号的二进制文件了。
内容的提问来源于stack exchange,提问作者antoine_co
相关产品推荐
相关产品推荐

