相关疑难解决方法(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万
查看次数

警告C4251:需要让dll接口供类的客户端使用

可能重复:
std :: vector需要让dll-interface由类'X <T>警告的客户端使用

这是我在这个小组中的第一篇文章.

我正在创建一个DLL并在应用程序的主文件中调用它.代码编译正常,但我收到以下错误:

 warning C4251: 'PNCBaseClass::m_vAvailChannelsFromRx' : class 'std::vector<_Ty>' needs to have dll-interface to be used by clients of class 'PNCBaseClass'
3>          with
3>          [
3>              _Ty=int
3>          ]
Run Code Online (Sandbox Code Playgroud)

我的代码如下:

#define TEST_API __declspec(dllexport)
class TEST_API PNCBaseClass
{
public:
vector<int> m_vAvailChannelsFromRx
};
Run Code Online (Sandbox Code Playgroud)

我已经找到了解决方案并尝试并失败了.

我不想禁用警告.

c++

6
推荐指数
1
解决办法
2万
查看次数

标签 统计

c++ ×2

dll ×1

visual-studio ×1