【问题标题】:How to generate .h header file using makefile and use it in same makefile for compilation of source?如何使用makefile生成.h头文件并在同一个makefile中使用它来编译源代码?
【发布时间】:2015-12-11 22:56:19
【问题描述】:

我想使用 makefile 生成一个头文件 abc.h。 并且,将此头文件包含在 abc.cpp 文件中,该文件必须从相同的 makefile 构建。

我面临的问题是在编译 .cpp 文件之前它没有生成 .h 文件。所以,我收到了一个找不到头文件的致命错误。

例如:


//abc.h
#define VAR "My Name"

//abc.cpp
#include "abc.h"

那么,问题是如何在编译源文件之前编写生成头文件的makefile,这样我就不会收到头文件包含错误?

我已经创建了如下的 makefile,但它在任何其他编译之前都没有生成文件:


-include dummy

noinst_LTLIBRARIES = window.la

.PHONY: dummy

dummy:
    @echo "#define VAR "MYNAME" > abc.h

window_la_SOURCES = \
    ../src/abc.cpp 

window_la_CPPFLAGS = \
    -I $(srcdir)/../src/

我想在开始为 abc.cpp 编译之前在上面的 makefile 中生成 abc.h。所以,我不会因为标题包含而遇到致命错误。请提出建议。

【问题讨论】:

  • 生成?它已经存在。是不是和abc.cpp在同一个目录下?
  • 为什么要生成表头?为什么不手写呢?看起来很简单。
  • 最简单的方法是:在编译(不链接)abc.ccp文件的规则上,添加头文件:abc.h作为前提条件。比如:abc : abc.c abc.h
  • gcc 编译器有一个参数可用于生成(在这种情况下)abc.d 文件,该文件还需要在 makefile 中为 #include 并作为先决条件列出abc.c 文件的编译规则。但是,将处理的只是 abc.c 文件中的 #include 语句。如果您想要任何其他内容,例如 abc.h 文件中的任何特殊 #defines,那么您“可以”在输出 abc.h 文件的 makefile 中有一个“inline/hereis”文件,但是,只需打开你的编辑器,生成文件,保存它。然后编译规则会将其列为先决条件
  • 如果abc.h文件不在同一目录下(即使在同一目录下),在编译命令中添加-I.(对于同一目录下)参数会告诉编译器在哪里找到头文件

标签: c++ c makefile


【解决方案1】:

如何在编译源文件之前编写生成头文件的makefile,以免出现头文件包含错误?

这里是一个简单的例子(假设abc.cpp存在,编译并拥有main()):

all: abc

abc.h: Makefile
        @echo "Generating $@"
        @echo "#define VAR \"MYNAME\"" > $@

abc.o: abc.h
abc.cpp: abc.h

abc: abc.o

默认构建abc

目标abc.hMakefile内的shell脚本生成,因此依赖于Makefile

告诉make abc.cpp 需要abc.h

告诉make,如果abc.h 发生变化,应该重建abc.o

告诉makeabc.o 构建abc

请提出建议。

在基于GNU make 的系统中生成代码非常困难且容易出错。虽然上面的简单示例看起来微不足道,但在较大的项目中,您可能会遇到各种问题,GNU make 几乎无法提供诊断或调试方面的帮助。

我的建议是,除非您准备通读整个 GNU make manual,否则应避免这种情况。

此外,对于只需要预处理器定义的情况,代码生成确实是一种过度杀伤:大多数 IDE 和构建系统已经提供了将预处理器定义添加到项目中的方法。 C/C++ 中的很多东西都可以简化为预处理器定义。

【讨论】:

  • 感谢您的详细解释。它现在对我来说很好。
【解决方案2】:

Makefile 是一种组织代码编译的简单方法。

你必须自己创建头文件。

【讨论】:

  • 不完全正确,但这是拥有 abc.h 文件的最简单方法
  • 是的。我可以自己创建头文件。但是,要求是从 makefile 创建头文件并将该头文件包含在必须通过相同的 makefile 构建的源文件中。
猜你喜欢
  • 2010-09-18
  • 1970-01-01
  • 2011-03-04
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 2012-05-03
相关资源
最近更新 更多