我正在尝试从包含诸如std :: vectors和std :: strings之类的对象的DLL中导出类-整个类通过以下方式声明为dll导出:
class DLL_EXPORT FontManager
{
问题是对于复杂类型的成员,我会收到以下警告:
警告C4251:“ FontManager :: m__fonts”:类“ std :: map <_Kty,_Ty>”需要具有“ FontManager”类的客户端使用dll接口,并带有[_Kty = std :: string,_Ty = tFontInfoRef ]
我可以通过以下警告类声明来删除某些警告,即使我没有更改成员变量本身的类型也是如此:
template class DLL_EXPORT std::allocator<tCharGlyphProviderRef>;
template class DLL_EXPORT std::vector<tCharGlyphProviderRef,std::allocator<tCharGlyphProviderRef> >;
std::vector<tCharGlyphProviderRef> m_glyphProviders;
看起来当成员被编译时,前向声明“注入”了DLL_EXPORT,但是它安全吗?当客户端编译此标头并在其一侧使用std容器时,它是否真的更改了任何内容?它会在将来使用这种容器DLL_EXPORT(并且可能不是内联吗?)吗?它真的解决了警告试图警告的问题吗?
我是否应该担心此警告,还是最好在这些结构的范围内将其禁用?客户端和dll将始终使用相同的库和编译器集构建,而这些仅是标头类。
我将Visual Studio 2003与标准STD库一起使用。
----更新----
尽管我认为答案很笼统,但我想将目标更多地作为目标,在这里我们谈论的是std容器和类型(例如std :: string)-也许问题确实是:
我们是否可以通过相同的库标头禁用对客户端和dll都可用的标准容器和类型的警告,并像对待int或任何其他内置类型一样对待它们?(这似乎确实对我有利。)如果可以,那么在什么条件下我们可以做到这一点?
还是应该禁止使用此类容器,或者至少要格外小心,以确保没有赋值运算符,复制构造函数等会内联到dll客户端中?
总的来说,我想知道您是否设计一个具有此类对象的dll接口(例如,使用它们将东西作为返回值类型返回给客户端)是一个好主意,为什么?我想拥有这个功能的“高级”界面...也许最好的解决方案是Neil Butterworth建议的-创建静态库?
C ++ Visual Studio DLL
一只甜甜圈
慕慕森
相关分类