【发布时间】: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 感谢您提供信息!这有帮助。有了这些知识,我就能弄清楚如何解决它。我将立即发布我的解决方案的答案。
标签: c++ visual-c++ boost dll