【问题标题】:How do I export templated classes from a dll without explicit specification?如何在没有明确说明的情况下从 dll 中导出模板类?
【发布时间】:2020-10-31 20:05:36
【问题描述】:

我有一个包含模板类的 dll。有没有办法在没有明确说明的情况下导出它?

【问题讨论】:

  • “显式规范”是什么意思?没有实例化模板?
  • 不用说:我定义模板的dll中的“模板类MyTemplate<int>”等。
  • 你所说的“出口”是什么意思?类型库中的 C++ 关键字或导出函数?
  • 导出函数。据我所知,编译器并未广泛支持“导出”。

标签: c++ dll templates


【解决方案1】:

由于模板的代码通常在标头中,因此您根本不需要导出函数。也就是说,使用 dll 的库可以实例化模板。

这是让用户自由使用模板的任何类型的唯一方法,但从某种意义上说,它与 dll 的工作方式背道而驰。

【讨论】:

  • 这里有一些关于如何导出模板类的文档:support.microsoft.com/kb/168958
  • 除了支持这种东西的vs6。这就是为什么从 VS6 到 VS10 的转换会导致错误
  • 由于 C++11 的变化,这不再是最新的
  • @Ident 你能详细说明一下吗?
  • @camino 已经有一段时间了,所以我不确定我指的是什么,但根据en.cppreference.com/w/cpp/language/…,您可以为显式实例化声明执行“extern template class|struct”。现在如果不导出函数,这将如何工作?
【解决方案2】:

您是否正在考虑通过 dll 导出模板类的实例化?一个类:

typedef std::vector<int> IntVec;

有一些讨论如何做到这一点: http://support.microsoft.com/kb/168958

另一种方法是通过针对此模板实例的包装类显式导出您感兴趣的每个函数。这样你就不会用比你实际感兴趣的符号更多的符号来弄乱 dll。

【讨论】:

  • 链接不好。我发现这篇文章名为“HOWTO:在类的内部和外部导出 STL 组件”。
【解决方案3】:

当编译器找到模板类的实例化时,例如 MyTemplate<int>,它会生成模板特化的代码。
因此,所有模板代码都必须放在头文件中,并包含在您要使用的地方。
如果您想“导出”您的模板类,只需将您的代码放在头文件中并将其包含在需要的地方。

【讨论】:

    【解决方案4】:

    在您的出口控制文件中。

    #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
      • 2015-12-17
      • 2018-07-19
      • 2015-07-19
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      相关资源
      最近更新 更多