【发布时间】:2020-08-07 00:02:44
【问题描述】:
我很难编译我的 CPP 文件,因为缺少头文件。我知道它丢失了,因为我想生成它。怎么样?
这是我目前所拥有的。问题是:当在多个 CPP 文件中使用“the_header.hpp”时,make 的递归调用效率不高(也不令人满意),因为“the_header.hpp”中包含的头文件似乎由于 并行性而被重建了几次强>。
CPP 文件 %.cpp :
#include "the_header.hpp"
// ...
我的 Makefile :
#
include *.g *.d
# *.g like generator
%.g: %.cpp
g++ -MM -MF $@ -MP -MG -MT $@ $<
make $@
#
%.d: %.g ;
#
%.o : %.cpp %.d
// g++ with auto-dependencies generation
# the_header.hpp matches
%.hpp : %.lcm
// Generate it
并且只是为了清除我的意图:当我编译 CPP 文件时,我会生成一个 %.g 文件,该文件的目标将为其自身添加更多先决条件。递归调用最终会将“the_header.hpp”视为先决条件(而不是最新的),生成它并重新生成 %.g。递归调用将看到“the_header.hpp”是最新的,无事可做,递归结束。编译过程。
此外,“the_header.hpp”是 LCM 生成的文件,其中 lcmgen 来自 %.lcm 文件。
在这样做之前,我刚刚(并行性很好,但都不令人满意):
#
%.o : %.cpp %.d $(patsubst %.lcm,%.hpp,$(wildcard *.lcm)
不知道实际使用了哪些 lcm 文件。另外,我混合了 C 和 C++ 项目,这可能会导致:
# lcmgen can be used with both C++ or C...
%.o : %.cpp %.d $(patsubst %.lcm,%.hpp,$(wildcard *.lcm) $(patsubst %.lcm,%.h,$(wildcard *.lcm)
我希望你会觉得它很有趣!
【问题讨论】:
-
“并行性很好,但都不令人满意)” 为什么不令人满意?
-
make.mad-scientist.net/papers/… 你可能会感兴趣。
-
@Jarod42 都不令人满意,因为我把所有可能性都放在了我需要的地方
-
@Jarod42 另外,我应用了make.mad-scientist.net/papers/… 中的内容:)
-
应该是
$(wildcard *.g *.d)。此外,当您刚刚在上一行中创建它时,您为什么要在%.g : %.cpp中make $@?另外:真的总是包含您收到的错误消息,只是为了更清楚我们在说什么。