【问题标题】:Makefile filter-out just... isn't working?Makefile 过滤只是...不起作用?
【发布时间】:2021-07-12 17:37:10
【问题描述】:

好的,我将包含一些关于我正在尝试完成的事情的背景故事,请随时跳到最后以举例说明我在说什么。

目前,我正在尝试围绕我的代码建立一个测试框架,尽可能减少对实际代码库的影响(我现在正在考虑其他几个框架,并希望使切换尽可能轻松)。我目前使用的方法是将我项目的所有目标文件与我的测试代码链接在一起,这样我就不必#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 的作用/它的语法是什么,那么我该如何完成我想要做的事情?

谢谢!

【问题讨论】:

  • "main.o" --> main.o ?
  • MAIN_O 设置为$(MAIN_PROG_OBJ_DIR)"/main.o",与build/test/release/main-prog-obj/main.o 不匹配,因为前者有引号(shell 在解析echo 命令时将其删除,但仍在处理完成中make)。
  • 啊,就是这样。谢谢大家 lmao
  • 如果你们中的任何一个人关心答案中的代表,请随时回答,我会解决/赞成。由于您在 5 秒内互相发表评论,因此我将首先标记哪个作为答案

标签: c makefile linker


【解决方案1】:

这是一个引用问题,make 按字面意思解释"main.o",因此不会从列表中过滤掉main.o。令人困惑的是,当我回显"main.o" 时,shell 会解析引号并将main.o 传递给内置的 echo。

【讨论】:

  • 在调试 make 文件时,始终使用 $(info sometext $(somevar)) 以防止不必要的解释层。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
相关资源
最近更新 更多