我有一系列小型库“模块”,用于处理非常具体的任务。单个模块通常只包含.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
文件,其中包含使用模板的所有模块吗?如果是这样,该文件是否还应包含非模板模块?这似乎很快就会成为一个组织混乱。
答案 0 :(得分:3)
许多编译器无法将模板“预编译”到库中。我最好的建议是将它们视为头文件;头文件没有编译成库,它们只是包含在内。
当更改量最小时,我将代码编译到库中。这通常会加快构建过程,因为这些文件不需要再次编译(并且再次......)。
答案 1 :(得分:1)
我是否应该拥有包含所有使用模板的模块的CompileThis.cpp文件?
是的 - 你仍然需要一个对象来链接。它也很好,因为它将执行语法/实例化检查(假设您的依赖项已正确排序)。
如果是这样,该文件是否还应包含非模板模块?
取决于结构。
至少应包括/定义必须导出的内容(及其依赖项)。
它应该经常包含模块所代表的标头,以便在包级别轻松检测错误问题。
理想情况下,您将添加所有必要的概念和一些实例(在某些情况下)。
这使得维护更容易,并且当您意识到已经从需要0个导出的符号转移到需要一个或多个符号时,不需要进行重大重组。