建立"Monolithic"图书馆

Building "Monolithic" Libraries

本文关键字:图书馆 Monolithic 建立      更新时间:2023-10-16

我有一系列小的库"模块",用来处理非常具体的任务。单个模块通常由一个.h和一个.cpp组成,可能还有另一组提供用户可能会觉得有用的相关非朋友、非成员功能。

例如,Foo.h可以声明一个类Foo,由Foo.cpp定义,FooUtilities.h可以声明一个函数使用Foo,由FooUtilities.cpp定义。

通常要在我的程序中使用这些模块,我将.h.cpp添加到我的项目中,并在任何文件中添加#include.h。然而,对于使用更多潜在相互依赖模块的大型程序来说,这将带来很大的不便。因此,我想把它全部编译成一个单一的静态或动态库,这样我就可以把库文件添加到我的项目中,把头搜索目录设置为包含上述.h文件的文件夹,然后编译。

看起来很简单,对吧?我所要做的就是用静态/动态库作为其构建目标启动一个新项目,然后添加所有适当的文件。.cpp文件,无论如何#include.h文件,将被编译并添加到最终产品中。

然而,一些模块使用模板,因此必须使用.tpp而不是.cpp.tpp文件仅用于组织,并且通过其各自的头文件#include d,这与正常模块的处理方式相反。因此,只是将它们添加到我的库项目中不会编译任何东西。

我该如何解决这个问题?我应该有一个CompileThis.cpp文件,包括所有使用模板的模块?如果是,这个文件是否也应该包括非模板模块?看来这很快就会变成一场组织混乱。

许多编译器不能将模板"预编译"为库。我最好的建议是把它们当作头文件;头文件不会被编译成库,它们只是被包含在内。

当更改量最小时,我将代码编译到库中。这通常会加快构建过程,因为这些文件不需要再次编译(一次又一次…)。

我应该有一个CompileThis.cpp文件,包括所有使用模板的模块?

是的-你仍然需要一个对象来链接。它还很好,因为它将执行语法/实例化检查(假设您的依赖项正确排序)。

如果是,该文件是否也包括非模板模块?

取决于结构

  • 至少应该包含/定义它必须导出的内容(以及它们的依赖项)。

  • 它通常应该包括模块所代表的头文件,以便在包级别上容易地检测错误问题。

  • 理想情况下,您将添加所有必要的概念和一些实例(在某些情况下)。

这使得它更容易维护,并且当您意识到您已经从需要0个导出符号变为需要一个或多个导出符号时,不需要进行重大的重构。