【问题标题】:Generated Dependencies issue生成的依赖问题
【发布时间】:2019-10-05 17:22:55
【问题描述】:

我使用以下目标为我的项目生成了依赖项。

只编译生成的依赖的第一行。

然后,我的主文件依赖于我项目中的所有源文件; 有什么想法吗?

我的依赖文件是这样生成的:

rules.d : $(wildcard *.c) $(wildcard *.h)
        gcc -MM $(wildcard *.c) > rules.d

然后我做了

-include rules.d

然后只编译第一个生成的依赖项。 rules.d 包含例如

main.o:main.c *.h
a.o=a.c
b.o=b.c
c.o=c.c

我们在项目中有以下文件

a.h a.c 
b.h b.c 
c.h. c.c

main.c(包含main函数),包含所有头文件。 我以这种方式拆分我的项目,因为这是团队的强制要求。

任何帮助将不胜感激。

【问题讨论】:

  • 您能否澄清一下问题:“仅编译生成的依赖项的第一行。” ?
  • 我不明白为什么人们会到处将这些问题标记为“接近”,因为它们“与编程无关”。在哪个领域,编写 makefile 不算编程?
  • 我无法重现您的情况。我也无法理解您是如何在rules.d 文件中获得结果的。我从来没有听说过gcc 将像a.o=a.c 这样的变量赋值生成到依赖列表中。我也从未见过它会生成像*.h 这样的通配符先决条件。您确定您确实正确地将文件内容剪切并粘贴到您的问题中吗?如果是这样,您的 makefile 中肯定有比您在此处提供的更多内容。
  • 在提问时,最好显示您输入的用于调用make 的命令行,以及您获得的(相关)输出,以及它不是什么方式的具体描述你想要的。
  • @dash-o rules.d 有 main.o: *.h main.c / a.o:a.c / b.o:b.c / c.o:c.c 。只有第一部分是通过 gcc 评估的,这将导致 main.o only

标签: c++ c gcc makefile


【解决方案1】:

当你说只编译第一个依赖项时,我假设你的意思是当你运行make时,只编译main.o或生成rules.d

这可能是因为您在makefile 的顶部 添加了include rules.d 和/或构建rules.d 的目标。它应该被添加到你的makefile的end

如果您在没有明确目标的情况下调用make,那么它将构建它在makefile 中找到的第一个目标并停在那里。如果您将构建rules.d 的规则作为makefile 中的第一件事,那么这就是所有将被调用的内容。

【讨论】:

    【解决方案2】:

    通过以下方式获得所有所需依赖文件的列表后:

    SRC := $(wildcard *.c)
    OBJ := $(SRC:.c=.o)
    DEP := $(SRC:.c=.d)    
    

    然后:

    rules.d : $(wildcard *.c) $(wildcard *.h)
    <tab>gcc -MM $(wildcard *.c) > rules.d
    

    应该是:

    %.d: %.c 
    <tab>gcc -MM $< > $@
    

    那么编译语句应该是:

    %.o: %.c %.d 
    <tab>gcc -Wall -Wextra -Wconversion -pedantic -std=gnu11 -c $< -o $@ -I. 
    

    make 文件末尾的某处应该是:

    ifneq "$(MAKECMDGOALS)" "clean"
    -include $(DEP)
    endif
    

    【讨论】:

    • 注意:如果使用 C++ 源文件,则不要使用 gcc,而是使用 g++gpp
    • 如果任何 '.h' 文件被更新,修改 '%.d' 规则以重新生成可能是有意义的。将涵盖嵌套 .h 文件的情况。
    猜你喜欢
    • 2012-01-03
    • 1970-01-01
    • 2016-07-04
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多