将C++仅头模板编译到共享库中
compile C++ header-only templates to a shared library
我正在开发模板类的代码库。它只是头文件(没有.cpp文件)。我想隐藏实现,并提供一个共享库和几个只包含声明的头。不幸的是,这听起来毫无意义。既然没有编译过的代码,那么在这样一个共享库中会有什么呢?编译后试图从标头中删除定义,会导致未定义的引用。有没有一种方法可以强制编译器在dll或共享库中发送对象,而不必显式实例化模板类?
不,在可预见的未来,没有也不会有这样的方法。提供模板C++代码的唯一方法是仅作为头文件。模块可能会改变这一点,但在库完成之前,这不太可能发生。
您可以尝试将其拆分为实现,并显式实例化所有可能的用例。然后,您提供的库将无法使用任何其他类型,而不是实例化的类型,这将大大减少模板带来的好处。
模板实现需要在编译时已知。这就是为什么您不能将实现和声明分开。因此,如果你想拥有模板的优势,就没有办法绕过你的头。
我也遇到了同样的问题。
实际上,没有办法分离模板类的头文件和源文件。我们可以这样做,但为此我们必须将源文件本身#include "source.spp"
包含在头文件中,这样编译器才能在编译时找到实现。
除了简单的维护外,这毫无意义。但是,您必须向客户端证明.h和.cpp文件,因此会有额外的开销。
我放弃了,采用了仅限标题的解决方案。
相关文章:
- 如何使用 CMake 在 android 构建上编译和共享两个 c++ 库
- 将预编译的 C 共享库与 JNI/NDK 结合使用
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- CMake 添加和删除宏定义以编译共享库/可执行文件
- 使用 Flutter 从 Android 上的原生编译共享库中调用函数
- 在VS2017中,我们如何在项目成员之间共享编译设置
- 使用共享库编译可执行文件时仅链接所需的符号
- 运行程序时找不到共享对象库,但在编译过程中链接了它
- 使用 -O1 优化标志编译项目时共享库崩溃
- GCC 中使用 -O3 的共享库编译不会导出与 -O0 中那样多的符号
- 如何使用Makevars链接到RCPP中已经编译的外部共享库
- 编译为"共享库"的源代码
- Qt项目与自定义共享库交叉编译Qt
- 交叉编译 qt:加载共享库时出错
- 使用运行时参数与编译时参数在类之间共享代码
- 构建共享对象 - 使用 Ninja 编译适用于 OSX 和 Windows 上的 Ubuntu Crush
- 加载共享库时出现 Codelite 错误,但我可以编译它
- 将函数从控制台应用程序移动到共享库项目似乎会带来不相关的编译错误
- 如何将所有依赖项和共享库编译为一个二进制文件
- 如何测试共享对象/共享库已正确编译