将C++仅头模板编译到共享库中

compile C++ header-only templates to a shared library

本文关键字:共享 编译 C++      更新时间:2023-10-16

我正在开发模板类的代码库。它只是头文件(没有.cpp文件)。我想隐藏实现,并提供一个共享库和几个只包含声明的头。不幸的是,这听起来毫无意义。既然没有编译过的代码,那么在这样一个共享库中会有什么呢?编译后试图从标头中删除定义,会导致未定义的引用。有没有一种方法可以强制编译器在dll或共享库中发送对象,而不必显式实例化模板类?

不,在可预见的未来,没有也不会有这样的方法。提供模板C++代码的唯一方法是仅作为头文件。模块可能会改变这一点,但在库完成之前,这不太可能发生。

您可以尝试将其拆分为实现,并显式实例化所有可能的用例。然后,您提供的库将无法使用任何其他类型,而不是实例化的类型,这将大大减少模板带来的好处。

模板实现需要在编译时已知。这就是为什么您不能将实现和声明分开。因此,如果你想拥有模板的优势,就没有办法绕过你的头。

我也遇到了同样的问题。

实际上,没有办法分离模板类的头文件和源文件。我们可以这样做,但为此我们必须将源文件本身#include "source.spp"包含在头文件中,这样编译器才能在编译时找到实现。

除了简单的维护外,这毫无意义。但是,您必须向客户端证明.h和.cpp文件,因此会有额外的开销。

我放弃了,采用了仅限标题的解决方案。