如何解决Makefile 过滤掉只是...不起作用?
好的,我将包含一些关于我正在努力完成的事情的背景故事,请随意跳到最后的示例来演示我在说什么。
目前,我正在尝试围绕我的代码设置一个测试框架,尽可能减少对实际代码库的影响(我现在正在考虑其他几个框架,并且想要使切换尽可能无痛)。我目前使用的方法是将我项目的所有目标文件与我的测试代码链接在一起,这样我就不必#include
源文件或使用其他一些技巧。
由于显而易见的原因,这种方法会导致 main
函数出现问题;我目前的计划是不链接定义 main
的项目中的目标文件。这会阻止我测试它,但它真的很简单,任何问题都会很明显,所以我可以接受。 (我想说这种方法优于在 main.o
中使用符号表的替代方法,这是我目前能想到的唯一替代方法。)
目前的问题是我似乎无法让 make
从我链接在一起的目标文件列表中实际过滤掉 main.o
,见下文。
我正在谈论的承诺演示:
MAIN_PROG_OBJ_DIR ::= build/test/release/main-prog-obj
# In the actual Makefile,this is generated as usual
MAIN_PROG_OBJS ::= build/test/release/main-prog-obj/state.o build/test/release/main-prog-obj/main.o build/test/release/main-prog-obj/util.o build/test/release/main-prog-obj/process_args.o
MAIN_O ::= $(MAIN_PROG_OBJ_DIR)"/main.o"
OBJS_FOR_BUILD ::= $(filter-out $(MAIN_O),$(MAIN_PROG_OBJS))
.PHONY: test
test:
@echo should be removed [$(MAIN_O)]
@echo OBJS_FOR_BUILD [$(OBJS_FOR_BUILD)]
在我的系统上,使用 make -f testmk test
运行它会产生:
should be removed [build/test/release/main-prog-obj/main.o]
OBJS_FOR_BUILD [build/test/release/main-prog-obj/state.o build/test/release/main-prog-obj/main.o build/test/release/main-prog-obj/util.o build/test/release/main-prog-obj/process_args.o]
显然我误解了 $(filter-out
的作用/它的语法是什么,那么我该如何完成我想要做的事情?
谢谢!
解决方法
这是一个引用问题,make
按字面解释 "main.o"
,因此不会从列表中过滤掉 main.o
。混乱来自这样一个事实:当我回显 "main.o"
时,shell 解析引号并将 main.o
传递给内置的 echo。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。