建立"Monolithic"图书馆
Building "Monolithic" Libraries
我有一系列小的库"模块",用来处理非常具体的任务。单个模块通常由一个.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个导出符号变为需要一个或多个导出符号时,不需要进行重大的重构。
- 个人图书馆,数字正数或负数
- 像 POCO 这样的C++图书馆如何访问网络?
- 与第三方公共图书馆/代码接口
- Abseil和CMake在图书馆
- 如何制作跨平台图书馆
- MinGW在Cygwin上.关于链接GNU科学图书馆的一些问题
- 与libc相比,Gnu科学图书馆的性能较差
- 图书馆时间.H与C++
- C++的"皮条客我的图书馆"
- 制作不认识我的图书馆
- 谷歌丁克图书馆大楼C++
- 将Thirt-Party共享图书馆与Python Ctypes集成
- Visual Studio 2012静态图书馆与Visual Studio 2017
- Visual Studio 2017无法通过图书馆构建
- 如何获取当前图书馆路径
- 分配但不使用分配器的标准图书馆设施
- 带有Visual Studio的第三方图书馆
- Jacobi SVD的Eigen图书馆
- 在编译像Pillow之类的图书馆时,如何更改Python dll的名称
- 建立"Monolithic"图书馆