c++ - Boost Serialization - 导出多个 CPP 文件

标签 c++ serialization boost macros

最近几天我一直在为 Boost 序列化问题而苦苦挣扎:

我正在尝试序列化和反序列化多个文件中的多个派生 类。为了保持通用性,我创建了模板函数,例如:

template<typename T>
void
Helper::SaveToFile(T* data, std::string file)
{
    std::ofstream ofs(file.c_str());
    boost::archive::text_oarchive oa(ofs);
    oa << data;
}

为了派生类的序列化工作,我需要使用 Boost 宏 BOOST_CLASS_EXPORT。但是,我无法将此模板方法放在 CPP 文件中,并且在 header 中使用宏时,我得到了这些恼人的“duplicate init_guid”错误。

即使我选择不使用模板方法,我仍然会遇到这些错误,因为我在不同的文件中使用了不同的序列化方法,因此导出了多次。

有没有人对如何使用模板方法或如何在多个 CPP 文件中导出类有任何提示?

我已经尝试将 BOOST_CLASS_EXPORT 拆分为 BOOST_CLASS_EXPORT_KEYBOOST_CLASS_EXPORT_IMPLEMENT,仍然导致相同的错误。此外,当只有特定类的头文件时,我真的不知道将 BOOST_CLASS_EXPORT_IMPLEMENT 宏放在哪里。

最佳答案

你走在正确的轨道上。

拆分为BOOST_CLASS_EXPORT_KEYBOOST_CLASS_EXPORT_IMPLEMENT确实是解决方案的关键。

与所有带有外部链接的 C++ 符号一样,您

  • 可以将声明放在一些共享位置(比如头文件)
  • 必须将定义放在单个翻译单元中,以便只有一个链接器输入包含定义。

在这种情况下,只需将 BOOST_CLASS_EXPORT_IMPLEMENT 包含在最多一个(静态)链接的翻译单元(想想:cpp 文件)中。

查看背景:

关于c++ - Boost Serialization - 导出多个 CPP 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32442778/

相关文章:

c++ - 隐藏返回给调用者的实例方法

c++ - 编译时如何使用外部模板参数

ruby-on-rails - 使用(序列化的)数组而不是连接表来链接两个数据库表会很疯狂吗?

c++ - 如何将使用 boost::asio 的 native C++ 静态库导入 CLI/C++ 混合模式应用程序?

c++ - 如何解析末尾带有可选分隔符的列表?

c++ - 添加 boost 库作为 Bazel 依赖项 c++

c++ - 找不到 SDL.h 时

c++ - 从表中了解运算符优先级

python - 带分页的 Django API 列表 - 页面不是 JSON 可序列化的

symfony - 如何使用 Symfony Serializer 反序列化通过提升属性在构造函数上声明的嵌套对象数组?