【问题标题】:Makefile doesn't rebuild the obj's when the CFLAGS are modified?修改CFLAGS时Makefile不会重建obj吗?
【发布时间】:2013-09-04 01:27:51
【问题描述】:

我们知道二进制文件依赖于 obj,而 obj 依赖于 .c 文件(假设是 C 项目)。假设我有一个 env.mk 文件。这个文件有一个类似'export NO_DISPLAY=YES'的标志。在主 Makefile 中,我有以下内容。

ifeq ($(NO_DISPLAY),YES)
CFLAGS += -D__DISPLAY_DISABLE
endif

显然,env.mk 包含在主 make 文件中。无论何时,我都会更改标志值“NO_DISPLAY”。 makefile 永远不会再次重建可执行文件。但是,当删除 .o 文件时,同样可以正常工作。我了解其背后的原因,因为它取决于 .c,.h 文件。 .c .h 文件没有被修改,因此 makefile 忽略重建它。但是,如果更改了 CFLAGS 值,我希望 makefile 重建代码。我该怎么做?请注意,我不想删除对象并重建它。

target_dbg: $(patsubst ./src/%.c,./obj_dbg/%.o,$(wildcard ./src/*.c)) 
    @echo "Target main rule__dbg $(NPROCS)"
    $(CC) $(patsubst ./src/%.c,./obj_dbg/%.o,$(wildcard ./src/*.c)) $(LIBS) -o gif_dbg 

./obj_dbg/%.o: ./src/%.c ./include/*.h 
    @echo "I am called first..dbg"
    @mkdir -p ./obj_dbg
    #$(CC) $(CFLAGS) -E $<
    $(CC) $(CFLAGS) $(LDFLAGS) -DDEBUG -c $< -o $@

任何帮助将不胜感激。

【问题讨论】:

    标签: makefile


    【解决方案1】:

    Make 只需检查文件上的时间戳即可工作。您几乎不希望每个构建工件都依赖于您的 Makefile(至少在积极开发它时不会),但如果您真的希望 Make 处理这种依赖关系,您可以将 CFLAGS 定义放在辅助文件 buildflags.mk 中,包括它来自主Makefile,并使所有目标文件依赖于buildflags.mk

    不过,我几乎不认为有人会在实践中真正做到这一点。在某些情况下,确保获得干净构建的唯一方法是刷新所有内容并重新开始。确保您拥有良好且最新的 realclean 和/或 distclean 目标,并确保在对构建基础架构进行根本性更改时记得使用它们。有一个夜间构建工作(或类似的),它从一个完全干净的状态开始构建——例如通过将新副本检出到临时目录中——显然也是一个好主意。

    或者,或者另外,在每个对象文件中包含构建标志的副本作为静态字符串,以便您稍后验证它们,可能使用--help 选项或类似选项。

    【讨论】:

      【解决方案2】:

      每次更改CFLAGS 时,您都可以使用make-B 选项强制重建。见this answer

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-28
        • 2020-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多