c++ 如何从一个没有显式规范的dll中导出模板化的类?

k7fdbhmy  于 2023-03-14  发布在  其他
关注(0)|答案(4)|浏览(185)

我有一个dll包含一个模板类。有没有办法导出它没有显式规范?

afdcj2ne

afdcj2ne1#

因为模板的代码通常在头文件中,所以根本不需要导出函数,也就是说,使用dll的库可以示例化模板。
这是给予用户自由使用任何类型的模板的唯一方法,但在某种意义上,它违背了dlls的工作方式。

oxalkeyp

oxalkeyp2#

您是否正在考虑通过dll导出模板类的示例化?类沿着所示:

typedef std::vector<int> IntVec;

下面有一些关于如何执行此操作的讨论:http://support.microsoft.com/kb/168958
另一种方法是通过一个 Package 器类显式地导出你感兴趣的函数,这样你就不会在dll中加入比你实际感兴趣的更多的符号。

c9qzyr3d

c9qzyr3d3#

当编译器找到模板类的示例化(如MyTemplate)时,它将生成模板专门化的代码。
因此,所有模板代码都必须放在头文件中,并包含在要使用它的位置。
如果你想“导出”你的模板类,只要把你的代码放在一个头文件中,并把它包含在需要的地方。

u4vypkhs

u4vypkhs4#

在你的出口管制文件里。

#ifdef _WIN32
    #ifdef XXXX_BUILD
        #define XXXX_EXPORT __declspec(dllexport)
        #define XXXX_EXTERN
    #else
        #define XXXX_EXPORT __declspec(dllimport)
        #define XXXX_EXTERN extern
    #endif
#else
    #define XXXX_EXPORT
    #define XXXX_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
https://www.betaarchive.com/wiki/index.php?title=Microsoft_KB_Archive/168958
附言
引用一个模板类会使它存在。特别是,静态变量的空间是分配给DLL的。当我在2018年左右测试这个的时候,没有extern,每个DLL都会单独为每个DLL的静态变量分配内存。
Unix和. so的导出方式稍有不同。通常使用#ifdef _WIN32将Windows MSVC所需的代码与其他编译器分开。我们以前在我的公司也是这样做的,但我现在无法访问这些代码。
但您需要达到相同的结果,即让编译器使用来自另一个DLL的类中的静态变量,而不是为每个DLL创建静态变量。
你可能会争辩说导出应该告诉编译器这样做,也许自2018年以来情况已经发生了变化。

相关问题