如何使Make在编译前生成头文件?

问题描述 投票:0回答:1

我在编译我的CPP文件时很吃力,因为缺少一个头文件。我知道它不见了,因为我想生成它。怎么做?

以下是我目前所做的。问题是:当 "the_header.hpp "被用在几个CPP文件中时,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生成的文件,从%.lcm文件中提取lcmgen。

在这样做之前,我只是(这在并行的情况下效果很好,但都不满意) 。

#
%.o : %.cpp %.d $(patsubst %.lcm,%.hpp,$(wildcard *.lcm)

不知道实际使用的是哪个lcm文件。此外,我有混合的C和C++项目,这可能会导致.C和C++的项目。

# lcmgen can be used with both C++ or C...
%.o : %.cpp %.d $(patsubst %.lcm,%.hpp,$(wildcard *.lcm) $(patsubst %.lcm,%.h,$(wildcard *.lcm)

我希望你会发现它的娱乐性 !

c++ c gcc makefile
1个回答
1
投票

没有办法使用任何形式的现代自动生成构造头文件的先决条件。 当头文件不存在时,任何基于编译器的先决条件生成器都会失败。

对于生成的头文件,除了显式声明先决条件之外,你几乎没有任何合理的选择。 不过你没有理由需要在模式规则里面这么做,那只会增加很多复杂性。

假设你有源文件 foo.c, bar.cbaz.c 和前两个取决于生成的头,但最后一个不取决于。 只要在你的makefile中添加这几行就可以了。

foo.o bar.o : the_header.hpp

这样就可以了. 不需要搞乱模式规则。

© www.soinside.com 2019 - 2024. All rights reserved.