【问题标题】:Exporting template classes c++导出模板类 c++
【发布时间】:2016-02-28 16:54:11
【问题描述】:

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

注意:虽然脚印的大小并不是众多原因中的唯一一个,但暂时我们可以坚持它是主要原因。

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

如何解决这个问题?

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

【问题讨论】:

  • 没有“模板类”之类的东西。 C++ 有类模板。类模板是一个模板。这不是一堂课。您不能从库中导出它。您也不能从库中导出内联函数。您可以使用精心设计的现代编程语言来解决这个问题。
  • 是的,我提到了一个类模板。感谢您的回答。你能建议任何其他替代方案来解决这个问题吗?除了改变编程语言。
  • 您知道有一个 C++ 库可以解决您的问题吗?查看编译器附带的标准库。看升压。这些是现有的最好的 C++ 库。你想比世界上最好的更好吗?这是一个非常崇高的愿望,但你不觉得在网上问陌生人怎么做有点幼稚吗?
  • 好的,感谢您的快速回复。我认为这并不幼稚,因为解决问题的一种可能方法是在线检查。当您遇到问题时,请在论坛上在线查看是否有人遇到过/曾经遇到过类似的问题?如果他们已经解决了,他们是如何解决的。可能“你能建议”这句话引发了错误的想法。我不是想强行回答,而是问你是否知道任何替代方案。再次感谢您。

标签: dll dllimport dllexport .so


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2022-01-11
    • 2017-12-30
    相关资源
    最近更新 更多