c++ - 将压缩文件嵌入到 C++ 程序中

标签 c++ installation cross-platform

我想用 C++ 创建一个跨平台安装程序。它可以是任何压缩类型,例如 zip 或 gzip,像普通安装程序一样嵌入程序本身。我不想在不同的平台、linux 和 windows 上创建很多更改。如何跨平台将文件嵌入和提取到 C++ 程序?

最佳答案

C++ 对于跨平台安装程序来说是一个糟糕的选择,因为没有跨平台机器代码这样的东西。

C++ 代码可移植性极强,但需要针对每个平台进行编译,然后您会为每个平台获得不同的输出可执行文件。

如果您想从单个源文件为多个平台构建安装程序,您可以使用 C++。但是,如果您想构建一个适用于多种平台的安装程序,您将需要使用一种解释或 JIT 编译的语言,并在所有目标上提供运行时支持。其中,唯一可能已经安装在每个平台的大多数计算机上的是 Java。


好的,假设您要从机器代码构建许多单平台安装程序,这就是所需要的:

您需要将压缩代码获取到程序中。您希望以不会严重影响加载时间,也不会导致编译花费几个月的方式来执行此操作。所以使用初始化的全局数组不是一个好主意。

一种方法是将您的数据作为附加部分进行链接。有一些工具可以帮助解决这个问题,例如Binary to COFF converter , 我也看过 ELF 版本,也许 this .但这仍然可能导致运行时库在执行开始之前尝试将整个文件导入内存。

另一种方法是使用特定于平台的资源 API。这是高效的,但特定于平台。

最直接的解决方案是简单地将压缩存档附加到您的可执行文件,然后再附加八个字节,其中包含压缩存档开始的文件偏移量。解包就像以只读模式打开可执行文件一样简单,fseek(-8, SEEK_END),读取正确的偏移量,然后寻找压缩数据的开头并将该流传递给您的解压器。


当然,现在我找到a website listing pretty much the same methods .

here's a program which implements the last option , 具有存储多个文件的额外能力。我不建议这样做,让压缩库负责存储文件元数据。

关于c++ - 将压缩文件嵌入到 C++ 程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5475039/

相关文章:

dojo - 将 Dojo 安装到 Aptana

android - Gingerbeard(2.3.7) 上的 INSTALL_FAILED_DEXOPT

c++ - 用于 xml 标签内容的单一匹配的正则表达式

c++ - 无法访问静态成员 -> 未解析的外部符号 i

ubuntu - 安装 FastCGI 开发工具包

支持 OpenGL 的 C++ GUI 工具包

c++ - 在 C++ 中获取总核心数量的跨平台代码片段是什么?

editor - 用于在多个平台之间共享通用设置的良好 Sublime Text 工作流程是什么

c++ - 使用 Vulkan 信号量等待 vkCmdCopyBuffer

c++ - &vector[0] 和 vector.begin() 有什么区别?