【问题标题】:How to automatically build a header with include of every file from folder c++ Cmake如何自动构建包含文件夹c ++ Cmake中每个文件的头文件
【发布时间】:2022-10-07 19:22:22
【问题描述】:

我一直在使用 c++ 17、visual studio 和 cmake 制作游戏引擎。

我为关卡制作者制作了一个 GUI。它需要 entitylist.h,它在实体/文件夹中的每个标题都有#include

如果用户想要创建一个自定义实体 Foo 并将其添加到一个级别:

他们将 Foo.h 添加到实体/

他们将#include \"Foo.h\" 添加到 entitylist.h

他们编译并可以将实体放置到 levelmaker GUI 中的关卡

然而,这是愚蠢的。用户不需要摆弄 entitylist.h。这种摆弄是危险的,浪费时间。其他引擎没有这样的要求。

有没有办法在构建时自动将实体/文件夹中每个文件的#include 添加到 entitylist.h 中?

  • 在 CMake 中,可以使用file(GLOB) 来收集目录中的所有文件。此命令创建一个包含所有文件的列表变量,因此您可以遍历此变量并使用file(APPEND) 将相应的行写入entitylist.h
  • 编写一个小程序来遍历目录中的文件,并为每个文件输出一个带有#include 的文件并不难。或者,它可以写入临时文件,并且仅在检测到内容更改时才更新输出文件。也就是说,我会询问为什么您的 GUI 需要一个需要持续更新的 entitylist.h - 如果 GUI 需要目录中的标头列表,为什么它不能遍历目录本身?
  • @Tsyvarev 如果您提供一个显示 CMake 风格的答案可能会更好?对于足够了解 CMake 的人来说,我的回答可能很容易翻译成 CMake。我还没到那里。
  • @eflwap:您使用 \"cmake\" 和 \"makefile\" 标签,但您确定它们都是适用的你的问题?如果您开发 CMake 项目,则无需手动编写 Makefile。

标签: c++ cmake


【解决方案1】:

您可以将entitylist.h 设为自己的构建目标。在 make 行话中,它看起来像这样:

# collect all the header files in the entities directory
ENTITIES=$(wildcard entities/*.h)

# the build target entitylist.h depends on all the header files:
entitylist.h : $(ENTITIES)
        @echo "#pragma once" > entitylist.h; \
        for ent in $(ENTITIES); do \
            echo "#include \"$$ent\""; \
        done >> entitylist.h       

【讨论】:

  • 这会导致 Cmakelist 以代码 1 退出,从而导致编译错误。我对 CMakeLists 一点也不了解,所以我无法真正调试这个问题。 entitylist.h 是否应该在某个子文件夹中,当我构建时它是否应该存在?
  • @eflwap 是的,这是一个makefile,所以它需要由 gmake 或类似的处理。如果你运行make -f the_above_file,它应该产生entitylist.hentitylist.h 以前不需要存在 - 但需要它的目标应该对它有依赖性。希望 Tsyvarev 或其他精通 CMake 的人可以提供纯粹的 CMake 答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
相关资源
最近更新 更多