建设“单片”图书馆

时间:2011-04-29 17:02:21

标签: c++ libraries compilation building

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

例如,Foo.h可能会声明一个名为Foo的类,Foo.cpp定义,FooUtilities.h可能声明一个使用Foo的函数FooUtilities.cpp

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

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

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

我该如何解决这个问题?我应该有一个CompileThis.cpp文件,其中包含使用模板的所有模块吗?如果是这样,该文件是否还应包含非模板模块?这似乎很快就会成为一个组织混乱。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

  

我是否应该拥有包含所有使用模板的模块的CompileThis.cpp文件?

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

  

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

取决于结构。

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

  • 它应该经常包含模块所代表的标头,以便在包级别轻松检测错误问题。

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

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