在 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++弹窗?

需要 Microsoft Visual C++ 14.0。使用“Microsoft Visual C++ 构建工具”获取它:http://landinghub.visualstudio.com/vis

microsoft visual c++ 6.0英文版怎么安装?

microsoft visual c++里的编译在哪里?

错误解决 :Microsoft Visual C++ 14.0 is require & Microsoft Visual C++ Builder 包丢失或者损坏