我有一个dll包含一个模板类。有没有办法导出它没有显式规范?
afdcj2ne1#
因为模板的代码通常在头文件中,所以根本不需要导出函数,也就是说,使用dll的库可以示例化模板。这是给予用户自由使用任何类型的模板的唯一方法,但在某种意义上,它违背了dlls的工作方式。
oxalkeyp2#
您是否正在考虑通过dll导出模板类的示例化?类沿着所示:
typedef std::vector<int> IntVec;
下面有一些关于如何执行此操作的讨论:http://support.microsoft.com/kb/168958另一种方法是通过一个 Package 器类显式地导出你感兴趣的函数,这样你就不会在dll中加入比你实际感兴趣的更多的符号。
c9qzyr3d3#
当编译器找到模板类的示例化(如MyTemplate)时,它将生成模板专门化的代码。因此,所有模板代码都必须放在头文件中,并包含在要使用它的位置。如果你想“导出”你的模板类,只要把你的代码放在一个头文件中,并把它包含在需要的地方。
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-clashttps://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年以来情况已经发生了变化。
4条答案
按热度按时间afdcj2ne1#
因为模板的代码通常在头文件中,所以根本不需要导出函数,也就是说,使用dll的库可以示例化模板。
这是给予用户自由使用任何类型的模板的唯一方法,但在某种意义上,它违背了dlls的工作方式。
oxalkeyp2#
您是否正在考虑通过dll导出模板类的示例化?类沿着所示:
下面有一些关于如何执行此操作的讨论:http://support.microsoft.com/kb/168958
另一种方法是通过一个 Package 器类显式地导出你感兴趣的函数,这样你就不会在dll中加入比你实际感兴趣的更多的符号。
c9qzyr3d3#
当编译器找到模板类的示例化(如MyTemplate)时,它将生成模板专门化的代码。
因此,所有模板代码都必须放在头文件中,并包含在要使用它的位置。
如果你想“导出”你的模板类,只要把你的代码放在一个头文件中,并把它包含在需要的地方。
u4vypkhs4#
在你的出口管制文件里。
其中XXXX_BUILD是项目中定义的符号。
以导出类。
其中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年以来情况已经发生了变化。