【问题标题】:GNU Make, value of `$<` from multiple prerequisite linesGNU Make,来自多个先决条件行的 `$<` 的值
【发布时间】:2018-07-05 16:01:15
【问题描述】:

在这样的情况下:

sample.o: sample.hpp
%.o: %.cpp
     $(CXX) -o $@ -c $<

sample.o: utility.hpp

编译 sample.o 时,第一个先决条件是什么($&lt; 的值)? sample.hpp? sample.cpp? ...utility.hpp? sample.hpp 是 make 找到的第一个先决条件。 sample.cpp 是包含配方的规则的第一个必要条件,这是最有意义的。 utility.hpp 被用作第一个先决条件是没有意义的,但我把它放在完整性上。

如果?

sample.o: sample.hpp utility.hpp
# implicit rule %.o: %.cpp

如果?

%.o: %.cpp # Removal of implicit rule/recipe.
sample.o: sample.hpp
%.o: %.cpp %.d
     $(CXX) $(DEPFLAGS) -o $@ -c $<

这里的第一个先决条件可以是第一行中的sample.cpp,或者sample.hpp,因为%.o: %.cpp%.o: %.cpp %.d 覆盖并且sample.hpp 是新的第一个先决条件;或再次sample.cpp,因为它是包含配方的规则的第一个先决条件。

如果?

sample.o: sample.hpp
%.o: %.cpp
sample.o: utility.hpp
%.o: %.cpp %.d
     $(CXX) $(DEPFLAGS) -o $@ -c $<

同样的参数,第四行可能是sample.hppsample.cpp

简而言之,GNU Make 用来填充$&lt; 的标准或算法是什么?

【问题讨论】:

    标签: variables makefile prerequisites


    【解决方案1】:

    信息文件说(我的重点):

    $&lt;

    第一个先决条件的名称。 如果目标得到了它的配方 从隐式规则来看,这将是由 隐含规则

    这证实了你所说的“最有意义”的假设。

    【讨论】:

    • 是的,但我也放置了没有隐式规则和显式删除隐式规则等的样本。
    • 好吧,我们可以轻松地使用echo '$&lt;' 进行实验,以获得这些案例的完整答案。
    • Peregring-lk 我不明白你在这里试图做出的区分。只有隐式和显式规则,仅此而已。如果有明确的规则,它就会被使用。如果没有,则使用它的隐含规则。如果两者都不存在,make 将失败并显示“没有构建目标的规则”。所以问“没有隐含规则”会发生什么是没有意义的。
    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多