3 回答
TA贡献1836条经验 获得超5个赞
该警告告诉您DLL的用户将无法跨DLL边界访问您的容器成员变量。明确导出它们使它们可用,但这是一个好主意吗?
通常,我会避免从您的DLL中导出标准容器。如果您完全可以保证您的DLL将与相同的运行时和编译器版本一起使用,则将是安全的。您必须确保使用相同的内存管理器释放在DLL中分配的内存。否则,充其量只能在运行时声明。
因此,请勿直接跨DLL边界公开容器。如果需要公开容器元素,请通过访问器方法公开。在您提供的情况下,将接口与实现分开,并在DLL级别公开接口。您对std容器的使用是DLL客户端不需要访问的实现细节。
或者,执行Neil的建议并创建一个静态库而不是DLL。您将失去在运行时加载库的能力,并且库的使用者必须在更改库时随时重新链接。如果您可以忍受这些妥协,那么静态库至少可以使您摆脱这个问题。我仍然认为您不必要地公开了实现细节,但这对您的特定库可能有意义。
TA贡献1856条经验 获得超17个赞
我发现处理这种情况的最佳方法是:
创建您的库,并使用库名称中包含的编译器和stl版本对其进行命名,就像boost库一样。
例子:
-用于dll版本的FontManager-msvc10-mt.dll,特定于MSVC10编译器,默认为stl。
-用于dll版本的FontManager-msvc10_stlport-mt.dll,特定于MSVC10编译器,带有stl端口。
-用于dll版本的FontManager-msvc9-mt.dll,特定于MSVC 2008编译器,具有默认的stl
-libFontManager-msvc10-mt.lib,用于静态lib版本,特定于MSVC10编译器,具有默认stl。
按照这种模式,您将避免与不同的stl实现相关的问题。请记住,vc2008中的stl实现与vc2010中的stl实现不同。
使用boost :: config库查看示例:
#include <boost/config.hpp>
#ifdef BOOST_MSVC
# pragma warning( push )
# pragma warning( disable: 4251 )
#endif
class DLL_EXPORT FontManager
{
public:
std::map<int, std::string> int2string_map;
}
#ifdef BOOST_MSVC
# pragma warning( pop )
#endif
- 3 回答
- 0 关注
- 569 浏览
添加回答
举报