代码之家  ›  专栏  ›  技术社区  ›  Boyan

如何在没有显式规范的情况下从dll导出模板类?

  •  13
  • Boyan  · 技术社区  · 17 年前

    4 回复  |  直到 17 年前
        1
  •  18
  •   James Hopkin    14 年前

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

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

        2
  •  6
  •   Scheff's Cat    5 年前

    typedef std::vector<int> IntVec;
    

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

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

        3
  •  3
  •   Paolo Tedesco    17 年前


    因此,所有模板代码都必须放在头文件中,并包含在要使用它的位置。
    如果您想“导出”模板类,只需将代码放在头文件中,并将其包含在需要的地方。

        4
  •  1
  •   Peter Driscoll    8 年前

    #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>;
    

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