1

我有一系列旨在处理非常具体的任务的小型库“模块”。一个单独的模块通常只包含 a.h和 a .cpp,可能还有另一组提供用户可能会觉得有用的相关非朋友、非成员函数。

例如,Foo.h可以声明一个名为 的类Foo,该类Foo.cpp定义,也 FooUtilities.h可以声明一个使用Foo由 定义的函数FooUtilities.cpp

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

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

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

我该如何解决这个问题?我应该有一个CompileThis.cpp包含所有使用模板的模块的文件吗?如果是这样,这个文件是否也应该包含非模板模块?看起来这可能会迅速成为组织混乱。

4

2 回答 2

3

许多编译器无法将模板“预编译”到库中。我最好的建议是将它们视为头文件;头文件不会编译到库中,它们只是被包含在内。

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

于 2011-04-29T17:08:18.633 回答
1

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

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

如果是这样,这个文件是否也应该包含非模板模块?

这取决于结构。

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

  • 它通常应该包括由模块表示的标头,以便在包级别轻松检测错误问题。

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

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

于 2011-04-29T17:24:18.937 回答