【问题标题】:Using the pattern of a pattern rule in a function with GNU make在 GNU make 的函数中使用模式规则的模式
【发布时间】:2011-02-16 17:31:50
【问题描述】:

我想使用模式规则来编译依赖于其他类的类。对于每个类,我定义了它所依赖的类和头文件。在编译特定类时,我想将每个类的每个头文件添加到先决条件中,如下所示:

# Class 1
C1 = C1
C1_H = C1.hpp
C1_T =
C1_O = C1.o

# Class 2, depending on class 1
C2 = C2 $(C1)
C2_H = C2.hpp
C2_T = 
C2_O = C2.o

.SECONDEXPANSION:

# pattern rule. Want to read the C%_H variable of every class this depends on
C%.o : C%.hpp C%.cpp $(foreach var,$$(C%),$($(var)_H))
    $(CC) -o $@ -c $<

foreach 函数在这里不起作用,因为 '%' 的扩展发生在函数扩展之后。有没有办法仍然这样做?

提前谢谢你

【问题讨论】:

  • 在 C++ 中,您不编译 ,而是编译 文件
  • 看看 gcc 的 -M 选项,例如见scottmcpeak.com/autodepend/autodepend.html
  • @sbi, Deve:一种修正阻抗不匹配的方法(“在 C++ 中,你不编译类,你编译 files”)是只有一个类每个文件。这是否是一个好主意取决于您和您的实验(我想它可能会使编译速度变慢?)。但是,它适用于 Java :)
  • @Merlyn:它适用于 Java,因为 Java 只有类。如果每个文件放一个类,你会把main()放在哪里?
  • @sbi:什么,你想运行你的程序吗? :) 你说得对,这个建议不起作用

标签: c++ makefile gnu


【解决方案1】:

1) 这里有一种方法可以满足您的要求(或多或少):

C1_HEADERS = C1.hpp
C1.o: $(C1_HEADERS)

C2_HEADERS = C2.hpp $(C1_HEADERS)
C2.o: $(C2_HEADERS)

# and so on

也许可以用函数调用或其他东西替换第二行 (Cn.o: $(Cn_HEADERS)),但我真的认为这不值得。

2) 以下是您的计划过于矫枉过正的一种方式:

// C1.hpp
#include "A.hpp"
...


// C1.cpp
#include "C1.hpp"
#include "B.cpp"
...

所以C1.o 依赖于B.hpp,但C2.o 不依赖。

3) 这是处理这些依赖项的更好方法:Advanced Auti-Dependency Generation

【讨论】:

  • 首先,我的最小示例似乎有点矫枉过正,是的。但是由于使用了模板,实际情况要复杂得多。您的示例肯定适用于简单的案例,但不适用于我打算做的事情。在编译和链接时,我必须区分类文件和模板文件。我想在定义依赖项时而不是在定义规则时这样做。感谢3)中的提示,我会检查一下。
  • 再次感谢 3) 中的链接,它对我帮助很大!
猜你喜欢
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多