导出模板类c ++

时间:2016-02-28 16:54:12

标签: dll dllimport dllexport .so

以下是我的方案: 我有一个可执行文件以及多个共享库(.dll或.so)。可执行文件和共享库(.dll或.so)都使用一组公共库。由于它们是公共库我想减少共享库的二进制脚印,为了减少共享库的脚印,我从可执行文件导出公共库的内容并将它们导入共享库(dll或.so) )。

注意:虽然脚印的大小不是唯一有多种原因的,但目前我们仍然坚持这是主要原因。

问题: 在公共库中有一些内联函数和一些模板类。当我使用性能优化标志编译可执行文件和共享库时,内联/模板类在可执行文件和共享库中都有内联。如果修改内联定义并且存在一些具有不同内联函数定义的共享库,则会产生问题。

如何解决这个问题?

当我开始考虑这个时,即使是CRT提供的STL类也是模板类。即使在他们的情况下也存在类似的问题。他们解决了这个问题吗?如果他们修改std :: vector的定义会发生什么?请帮忙。

1 个答案:

答案 0 :(得分:1)

类模板是一种创建类的机制。但是,在定义类的特定实例(使用模板参数)之前,这些类不会被实例化。

在导出控制文件中。

#ifdef XXXX_BUILD
    #define XXXX_EXPORT __declspec(dllexport)
    #define XXXX_EXTERN
#else
    #define XXXX_EXPORT __declspec(dllimport)
    #define XXXX_EXTERN extern
#endif

其中XXXX_BUILD是项目中定义的符号。

要导出您的课程。

XXXX_EXTERN template class XXXX_EXPORT YourClass<double>;

其中double是要用。实例化类的类型。

https://support.microsoft.com/en-us/help/168958/how-to-export-an-instantiation-of-a-standard-template-library-stl-clas