微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Makefile 过滤掉只是...不起作用?

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?