在 Microsoft Visual C++ 2015 中编译 DLL——警告 C4251 需要有 dll 接口才能被类的客户端使用——使用 Boost 时?
Posted
技术标签:
【中文标题】在 Microsoft Visual C++ 2015 中编译 DLL——警告 C4251 需要有 dll 接口才能被类的客户端使用——使用 Boost 时?【英文标题】:Compiling DLL in Microsoft Visual C++ 2015 -- warning C4251 needs to have dll-interface to be used by clients of class -- when using Boost? 【发布时间】:2016-11-09 16:31:59 【问题描述】:所以,我正在尝试为我的一个大型项目编译一个 DLL。这个想法是让它有几个部分。某种库,它被编译成 DLL,以及 DLL 链接到的应用程序。我不断收到以下警告:
warning C4251: 'plf::lfInvalidIndexExcpt::message': class 'boost::container::basic_string<char,std::char_traits<char>,boost::container::new_allocator<char>>' needs to have dll-interface to be used by clients of class 'plf::lfInvalidIndexExcpt'
这是一直给我带来麻烦的代码。
我的 DLL 导出/导入宏定义如下:
#ifdef LF_ENGINE_EXPORTS
#define LFE_API __declspec(dllexport)
#else
#define LFE_API __declspec(dllimport)
#endif
现在,我将 boost 与我的 库 一起使用,并且有一次我有以下内容:
typedef boost::container::string lfString;
lfInvalidIndexExcpt 类的定义如下:
namespace plf
class LFE_API lfInvalidIndexExcpt
public:
explicit lfInvalidIndexExcpt(lfSize idx);
lfInvalidIndexExcpt(lfSize idx, const lfString& descr);
const char* what() const throw();
private:
lfString message;
void makeMessage(lfSize idx, const lfString& descr);
;
;
我应该提到 lfSize 只是 std::size_t 的 typedef。
我想知道的是这个警告实际上意味着什么,如果我可以在我的 DLL 中使用这样的 Boost,如果有的话。另外,如果这不是使用 Boost 的正确方法,那是什么?
谢谢,
-扎克弗罗斯特
【问题讨论】:
这是一个警告,提醒您,如果您的 DLL 的客户端曾经使用过 message 成员,那么它将无法链接。如果您的班级中有内联函数,则可能会发生这种情况。或者,如果客户端创建或销毁此类的实例,则也需要导出构造函数和析构函数。析构函数是可能的故障模式,似乎您将其公开为跨 DLL 边界抛出的异常类型。由于 Boost 版本依赖性,总是很麻烦,而且一点也不麻烦。考虑改为从 std::exception 派生。 @Hans Passant 感谢您提供信息!这有帮助。有了这些知识,我就能弄清楚如何解决它。我将立即发布我的解决方案的答案。 【参考方案1】:所以,我似乎通过玩弄我的代码和窥探 *** 找到了解决我自己问题的方法!我似乎只需要从类声明中删除 DLL 导出宏并将其添加到成员函数中。它现在似乎编译和工作得很好!
解决方案来自这篇 *** 帖子(frast 的回答):std::vector needs to have dll-interface to be used by clients of class 'X warning
【讨论】:
以上是关于在 Microsoft Visual C++ 2015 中编译 DLL——警告 C4251 需要有 dll 接口才能被类的客户端使用——使用 Boost 时?的主要内容,如果未能解决你的问题,请参考以下文章
error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools,亲测100%安装
需要 Microsoft Visual C++ 14.0。使用“Microsoft Visual C++ 构建工具”获取它:http://landinghub.visualstudio.com/vis
microsoft visual c++ 6.0英文版怎么安装?
错误解决 :Microsoft Visual C++ 14.0 is require & Microsoft Visual C++ Builder 包丢失或者损坏