相关疑难解决方法(0)

从dll导出包含std :: objects(vector,map等)的类

我试图从包含std :: vectors和std :: strings等对象的DLL导出类 - 整个类通过以下方式声明为dll导出:

    class DLL_EXPORT FontManager
{
Run Code Online (Sandbox Code Playgroud)

问题是,对于复杂类型的成员,我收到此警告:

警告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;
Run Code Online (Sandbox Code Playgroud)

看起来像前导声明"注入"DLL_EXPORT编译成员时,它是否安全?当客户端编译此标头并使用他身边的std容器时,它是否真的会改变任何东西?它是否会在将来使用这样的容器DLL_EXPORT(并且可能不是内联的?)?它是否真的解决了警告试图警告的问题?

这个警告是我应该担心的,还是最好在这些结构的范围内禁用它?客户端和dll将始终使用相同的库和编译器集构建,并且这些只是标题类...

我正在使用Visual Studio 2003和标准STD库.

----更新----

我想更多地针对你,因为我看到答案是一般性的,这里我们讨论的是std容器和类型(例如std :: string) - 也许问题确实是:

我们是否可以通过相同的库标题禁用客户端和dll可用的标准容器和类型的警告,并像处理int或任何其他内置类型一样处理它们?(它确实似乎在我身边正常工作.)如果可以,我们可以做到这一点的条件是什么?

或者应该禁止使用这样的容器,或者至少要特别小心,以确保没有赋值操作符,复制构造函数等内联到dll客户端?

一般来说,我想知道你是否觉得设计一个具有这些对象的dll接口(例如使用它们将东西作为返回值类型返回到客户端)是一个好主意或不是,为什么 - 我想要这个功能的"高级"接口......也许最好的解决方案是Neil Butterworth建议的 - 创建一个静态库?

c++ dll visual-studio

59
推荐指数
5
解决办法
5万
查看次数

在C++库接口中安全地使用容器

在设计C++库时,我认为std::vector在公共接口中包含标准库容器是不好的做法(参见例如在dll导出函数中使用std :: vector的含义).

如果我想公开一个获取或返回对象列表的函数,该怎么办?我可以使用一个简单的数组,但后来我必须添加一个count参数,这使得界面更麻烦,更不安全.map例如,如果我想使用a ,它也无济于事.我想像Qt这样的库定义了自己的容器,这些容器可以安全地导出,但是我宁愿不把Qt作为依赖项添加,而且我不想滚动自己的容器.

在库接口中处理容器的最佳做法是什么?是否可能有一个小容器实现(最好只有一两个文件,我可以使用许可许可证),我可以用作"粘合剂"?或者甚至有一种方法可以使std::vector.DLL/.so边界和不同的编译器安全等等?

c++ containers api-design

12
推荐指数
1
解决办法
1583
查看次数

我可以将std :: string传递给DLL吗?

我将代码片段分成了一个,DLL因为它会经常更新,这样就可以更容易部署.

但我对我能做什么以及我不能做什么有疑问DLL.

  1. 我可以通过一个std:stringCString一个DLL
  2. 我可以将指针传递给structwith std::string members并将其填入DLL
  3. 可以DLL返回指向那里分配的结构的指针吗?它会有效吗?我可以删除吗?
  4. 什么应该更好地通过,a std::String或a Cstring

谢谢 !

c c++ dll memory-management

11
推荐指数
1
解决办法
8459
查看次数

标签 统计

c++ ×3

dll ×2

api-design ×1

c ×1

containers ×1

memory-management ×1

visual-studio ×1