我创建了几个测试文件test_*.c,每个测试函数都是我构建的c库的一个函数。
我首先编写了一个Makefile,用于编译每个c文件以生成相应的二进制文件:
TEST_SRCS = ${wildcard *.c}
TEST_EXECS = ${TEST_SRCS:.c=}
PROJECT_PATH = ../my_project
CFLAGS = -Wall -Wextra -Werror
%:: %.c ${PROJECT_PATH}/libmyproject.a
gcc ${CFLAGS} $< -L${PROJECT_PATH} -lmyproject -o $@
all: ${TEST_EXECS}
clean:
rm -f ${TEST_EXECS}
re: clean all
.PHONY: all clean re这就像预期的一样,所以当我输入make test_<name_of_my_function>时,如果存在'test_.c‘文件,它会编译它来创建'test_’二进制文件。
但是现在我想添加一条规则,如果我运行命令-g make debug_test_<name_of_my_function>**.**,将gcc标志添加到命令中,从而在调试模式下创建二进制。
我尝试添加特定于模式的规则debug_%,并使用特定于模式的值将-g附加到CFLAGS中。
TEST_SRCS = ${wildcard *.c}
TEST_EXECS = ${TEST_SRCS:.c=}
PROJECT_PATH = ../my_project
CFLAGS = -Wall -Wextra -Werror
%:: %.c ${PROJECT_PATH}/libmyproject.a
gcc ${CFLAGS} $< -L${PROJECT_PATH} -lmyproject -o $@
all: ${TEST_EXECS}
debug_%: CFLAGS += -g
debug_%: %
clean:
rm -f ${TEST_EXECS}
re: clean all
.PHONY: all clean re但是,例如,当我运行debug_test_function1时,我得到了以下ouptut:
make: *** No rule to make target 'debug_test_function1'. Stop.注意,无论我为目标`debug%`_使用什么先决条件规则,它都不会被执行(即使先决条件不是模式规则)。
还请注意,如果我在makefile中替换
debug_%: CFLAGS += -g
debug_%: %通过
debug%: %.c ${PROJECT_PATH}/libft.a
gcc ${CFLAGS} -g $< -L${PROJECT_PATH} -lmyproject -o $@它起作用了。但是在这里我会失去使用特定于模式的变量的好处。
任何线索哦,如何使用特定于模式的变量值来实现呢?
谢谢你的帮助!
发布于 2022-11-10 13:22:06
这是:
debug_%: %不定义模式规则。它删除一个模式规则。见GNU制作手册。因此,您没有在这里定义任何知道如何构建debug_test_function1的规则(因为没有文件debug_test_function1.c可用于构建它,唯一可用的规则是匹配-任何规则)。
你必须在这里提供菜谱,你不能省略它。但是很明显,您仍然可以添加一个特定于模式的变量;为什么不能呢?:
debug_%: CFLAGS += -g
debug_%: %.c ${PROJECT_PATH}/libft.a
gcc ${CFLAGS} $< -L${PROJECT_PATH} -lmyproject -o $@我不太清楚您所指的“模式特定变量的好处”,因为您似乎没有构建需要继承特定于模式的变量的其他先决条件。但以上所述应能奏效。
https://stackoverflow.com/questions/74386958
复制相似问题