【问题标题】:Boost Serialization MSVC 2015 do not compile in DEBUG modeBoost Serialization MSVC 2015 不在 DEBUG 模式下编译
【发布时间】:2017-01-23 22:29:43
【问题描述】:

由于某种原因,MSVC 不使用以下代码编译 boost 序列化示例:

class MyName
{
public:
    MyName(std::string _name, std::string _family_name)
        :name{ _name }, family_name{ _family_name }
    { }
private:
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    { ar & name; ar & family_name; } std::string name; std::string family_name;
};

int main()
{
    // create and open a character archive for output
    std::stringstream  ofs;

    // save data to archive
    {
        MyName my_name("MyName", "FamilyName");
        boost::archive::text_oarchive oa(ofs);
        // write class instance to archive
        oa << my_name;
        // archive and stream closed when destructors are called
    }

    // save data to archive
    {
        MyName my_name("afsf", "dgsass");

        boost::archive::text_iarchive oa(ofs);
        // write class instance to archive
        oa >> my_name;
        // archive and stream closed when destructors are called
    }
    return 0;
}

我收到以下错误:

Severity    Code    Description Project File    Line    Suppression State
Error   LNK2019 unresolved external symbol "public: __thiscall boost::archive::archive_exception::archive_exception(enum boost::archive::archive_exception::exception_code,char const *,char const *)" (??0archive_exception@archive@boost@@QAE@W4exception_code@012@PBD1@Z) referenced in function "protected: void __thiscall boost::archive::basic_text_iprimitive<class std::basic_istream<char,struct std::char_traits<char> > >::load<unsigned int>(unsigned int &)" (??$load@I@?$basic_text_iprimitive@V?$basic_istream@DU?$char_traits@D@std@@@std@@@archive@boost@@IAEXAAI@Z)  cpp11_cpp14_cpp17   D:\Projects_Programing\__Testing\cpp11_cpp14_cpp17\cpp11_cpp14_cpp17\cpp11_cpp14_cpp17.obj  1   

但是当我在发布模式下编译它时。 我已经读到它可能由于 MSVC STRICT 模式而发生,但我已经尝试过,它也不起作用。

有人遇到过这样的错误吗?

【问题讨论】:

  • 我创建了一个简单的MyName 结构,它对我来说编译得很好。请出示您的MyName 班级。
  • @lakeweb 下面你可以看到 MyName 的实现:class MyName { public: MyName(std::string _name, std::string _family_name) : name{ _name }, family_name{ _family_name } { } private: friend class boost::serialization::access; template&lt;class Archive&gt; void serialize(Archive &amp; ar, const unsigned int version) { ar &amp; name; ar &amp; family_name; } std::string name; std::string family_name; };
  • 仍然可以正常编译。我跑了,我认为是SP3。上半年某处出现的服务包。这是我从这里能想到的唯一事情。我只使用了两个标题,text_oarchive.hpptext_iarchive.hpp。你呢?我使用的是 1.62。你应该把它都贴出来,这会有所帮助。
  • @lakeweb 我也使用 boost 1.62 和 SP3。你应该明白它只发生在调试模式编译中。另外我放了 libboost_serialization-vc140-mt-gd-1_62.lib libboost_wserialization-vc140-mt-gd-1_62.lib libboost_exception-vc140-mt-gd-1_62.lib
  • 嗨,我只尝试了调试版本。我从不查看链接到哪些库,因为 boost 很好地处理了这一点。我使用一个库路径:$(BOOST_LIB),因此,如果您通过选择库进行链接,听起来好像缺少一个。不要添加库,只需将您的 Linker->General->Additional Library Directories 设置为您的 boost lib 文件夹。那么你就不用担心你需要什么库了。

标签: visual-c++ serialization boost visual-studio-2015


【解决方案1】:

我已经弄清楚了这个错误的原因。 当我尝试使用标志 /Za 编译时会发生这种情况(意味着从 MSVC 对 C++ 进行零扩展)。 当我删除此标志时,我的代码编译成功。

@lakeweb 感谢您的帮助和支持!!

不幸的是,我不明白为什么 MSVC 的某些扩展确实允许编译 Boost,但没有扩展它无法编译。很奇怪!!

可能是 Boost 端或 MSVC 端的错误。 有什么假设吗?

【讨论】:

  • 嗨,丹尼斯,我正在赶上。它在文档中没有明确说明,但因为 (msdn.microsoft.com/en-us/library/d9x1s805.aspx) [pragma 说] 根据定义,编译指示是特定于机器或操作系统的,并且通常对于每个编译器都是不同的。,可能是lib pragma 被禁用,因此 lib 未链接。
猜你喜欢
  • 1970-01-01
  • 2020-11-02
  • 2015-08-25
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
相关资源
最近更新 更多