如何使用 make 来维护一个通用的C++标头包含目录

How can I use make to maintain a common C++ header include directory?

本文关键字:C++ 包含目 一个 make 何使用 维护      更新时间:2023-10-16

我的项目由大约十几个组件组成,每个组件的源代码都位于主源代码目录下自己的子目录中。 许多组件使用来自其他组件的头文件,我正在尝试安排内容,以便这些头文件都可以在单个include/目录中使用。 如果这是一个坏主意,或者如果有更好的方法可以使一个组件的标头轻松提供给另一个组件,请立即停止我。

在构建组件后,将

组件的标头复制到include/非常简单:makefile 中的cp *.hpp ../include工作得很好。 但是,当make clean在单个组件上运行时,我想从include/中删除该组件的标头,而不删除任何其他组件。 据我所知,这意味着我必须在 makefile 的"remove"命令中维护组件头文件的列表,如下所示:

clean:
    rm -fv ../include/header1.hpp ../include/header2.hpp ...

维护此列表是手动工作,我想自动化。 我想解决这个问题,因为如果在将同一标头的新版本复制到位之前构建依赖于复制标头的组件,我预计会出现问题 - 诊断问题非常耗时。

如何让我的生成文件清理单独目录中的标头列表? 或者,是否有更好的方法可以使我的头文件可用于同一项目中的其他组件?

或者,是否有更好的方法可以使我的头文件可用于同一项目中的其他组件?

有两种明显而简单的方法:

  1. 首先将所有标头保留在include目录中
  2. 为每个组件设置CPPFLAGS,以告知在何处查找其依赖项。

对于小型、紧密耦合的项目,我推荐前一种方法。第二种方法更适合真正的组件化系统,因为它迫使您考虑项目中的内部依赖项。

复制文件并使用副本构建其他组件很容易出错,无论您如何手动或不手动。 拉斯曼斯在上面提出了一些替代方案。

但是,如果您想继续使用构建时复制方法,可以通过 make 进行清理,如下所示:

TO_COPY = $(wildcard *.hpp)
TO_REMOVE = $(patsubst %.hpp, ../include/%.hpp, $(TO_COPY))

第一个变量将包含当前目录中的所有 .hpp 文件,第二个变量将包含相同的文件,每个文件名前面都带有../include/。因此,您可以使用以下命令将文件复制到包含文件夹:

cp $(TO_COPY) ../include/

并在最后删除它们:

rm $(TO_REMOVE)