如何使用boost序列化?
Posted
技术标签:
【中文标题】如何使用boost序列化?【英文标题】:How to use boost serialization? 【发布时间】:2018-10-03 02:18:10 【问题描述】:我是编程爱好者。我想知道如何仅使用 boost 的序列化 (https://www.boost.org/doc/libs/1_36_0/libs/serialization/doc/index.html)。
我下载boost的时候库很多,文件夹很大,但是我只想用序列化库。我的用户是否需要安装所有 boost 才能使用序列化?
我是一个完整的初学者,所以如果您能告诉我将序列化到我的项目中需要执行的每个步骤,我们将不胜感激。例如,我是否必须静态链接库?我不知道。感谢您的帮助。
edit:我希望我的用户不必处理太多事情。那么有没有一种方法可以在不让用户安装任何东西的情况下使用 boost?谢谢。
【问题讨论】:
谁是“你的用户”?为什么使用 Boost 1.36.0? boost.org/doc/libs/1_68_0/libs/serialization/doc/index.html 我的用户是化学家。他们没有太多的计算机知识——至少我必须假设最坏的情况是他们没有太多的计算机知识。 那么您应该以您的软件安装程序而不是源代码的形式向他们提供软件。他们不应该关心你使用什么库的哪些部分。 目前,我只是发送来自发布版本的 .exe。你觉得这样好吗? 安装软件的方式不正确。更好地制作安装程序。 【参考方案1】:您通常需要在运行时链接与“动态库”(.dll) 匹配的“链接库”(传统上是 Windows 上的 .lib 文件)。当然,在运行时它需要存在,因此您需要“安装”它(以兼容的形式存在于目标机器上,因此与操作系统和架构相匹配)。
好消息:
-
MSVC 将为库 (https://www.boost.org/doc/libs/1_68_0/more/getting_started/windows.html#auto-linking) 执行“自动链接”
如果您在与目标平台类似的平台上构建,默认目标通常会与目标兼容
请注意,您可能需要间接要求(例如 Boost System)。
确实,您可以将库 XCOPY 部署在与 exe 文件相同的文件夹中,但这并不是一种真正常见的方法,如果您没有什么经验,这可能不是最好的主意。
如果您可以使用(免费)安装程序构建器(快速 google 到 https://www.techrepublic.com/blog/five-apps/five-apps-for-creating-installation-packages/ 之类的东西),您将享受了解所涉及复杂性的工具的指导。
【讨论】:
“确实,您可以将库 XCOPY 部署在与 exe 文件相同的文件夹中,但这并不是一种真正常见的方法,如果您没有什么经验,这可能不是最好的主意。 " - 实际上,这是 很常见,而且这也是一种完全合理的方法。它可以轻松处理目标系统上库的冲突版本,而无需安装 SxS 二进制文件或添加应用程序清单。它还极大地简化了应用程序的服务。见In Windows, the directory is the application bundle。【参考方案2】:我的用户是否需要安装所有 boost 才能使用 序列化?
当您将 boost、MSVC++ 和 MFC 运行时静态链接到您的应用程序时,您将获得一个包含所有依赖项的单个可执行文件。然后您的用户所要做的就是双击您应用程序的 .exe 文件。
从头开始构建 boost 库可能会很棘手,因此我建议您开始使用 download prebuilt binaries。确保下载与您的 Visual C++ 版本和您正在构建的应用程序的位数 (32/64) 完全匹配的包。 尽管从长远来看,自己构建 boost 可能是有益的,因此您不必依赖预构建的二进制文件是最新版本的 VC++ 的最新版本。
确保将 .lib 文件的目录路径添加到项目的库路径中。您不需要指定单独的 .lib 文件,因为 boost uses auto-linking。 如果您需要知道,静态库文件在文件名中包含“mt-s”(例如,32 位发行版的“libboost_serialization-vc141-mt-s-x32-1_68.lib”和“libboost_serialization-vc141” -mt-sgd-x32-1_68.lib" 用于 32 位调试版本)。
在您的项目设置中,确保选择 MFC 静态库(“通用”类别 >“使用 MFC”)。还可以选择“运行时库”>“多线程”(/MT) 或“多线程调试”(/MTd),具体取决于您的项目配置(C/C++ 类别)。如果您不这样做,则链接将失败,或者您将链接到 boost DLL。
【讨论】:
等等。自动链接是否也会让Boost 静态链接? (我想它必须是为了避免像system_category()
这样的全局变量的奇怪问题)
是的,它有效。我多年来一直在静态链接,从来没有问题。每次推出新版本的 boost 时,我都会进行 booststrap/b2 构建。我在尝试预建时遇到了问题。这些天我为 2015 年和 2017 年构建。使用this habit,它非常轻松。以上是关于如何使用boost序列化?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 boost std::vector of boost::unordered_map 进行序列化/反序列化
如何使用 Boost.serialize 序列化派生模板类?
如何使用 boost::serialization 序列化 std::vector?