如何将资源嵌入到单个可执行文件中?

Posted

技术标签:

【中文标题】如何将资源嵌入到单个可执行文件中?【英文标题】:How to embed resources into a single executable? 【发布时间】:2011-08-25 17:16:00 【问题描述】:

如果您曾经使用过 Game Maker 工具,那就有点像这样了。我希望能够获取我所有的声音、图像和其他类似的东西,并将它们嵌入到单个 C++ 可执行文件中。 Game Maker 将有一个内置编辑器,并将图像嵌入到 .gmk 文件中,当您打开它时,它会读取图像并在游戏中显示它们。我认为他将图像保存为不是图像,而是作为纯数据存储在 .gmk 文件中,并由编辑器或某些解释器写入 .exe 进行解释。我将如何制作类似的东西?

【问题讨论】:

【参考方案1】:

windows资源系统是这样工作的,所以如果你制作一个WinAPI或MFC应用程序,你可以使用它。此外,Qt 提供了相同的功能,但以独立于平台的方式。他们只是将原始二进制格式的文件写入普通 C++ 文件中的字节数组,因此它们作为数据编译到 exe 中。然后它们提供了像普通文件一样访问这些数据块的函数,虽然我不知道它们是如何工作的。可能是他们文件类的特殊实现,它只访问那些字节数组变量。

【讨论】:

非常有趣。我想这只是微软的另一件事情,比如directX 或WinAPI。在功能上非常有帮助,但不是跨平台的。但很高兴看到 QT 有类似的功能。 MSDN 的使用资源(Windows):msdn.microsoft.com/en-us/library/ms648008(v=VS.85).aspx【参考方案2】:

仅对于图像,一个非常简单的方法是使用XPM 格式。

此格式是有效的 C/C++ 头文件,因此您可以将其直接包含到 C++ 源文件中并直接使用。

这种方法的主要问题是 XPM 不是压缩格式,因此会占用大量存储空间。 因此,在实践中我只看到它用于图标和小型图形对象,但原则上你可以做更多。

XPM 的另一个很酷的地方是它易于阅读 - 再次非常适合设计小而简单的图标。

要将这个想法推广到其他格式,您可以做的是创建一个编译链:

    将目标文件编码为 ASCII(Uuencode 等) 将其转换为源文件中的单个命名 C 字符串。 创建一个只声明名称的标题 定义一个从字符串中恢复二进制形式的函数

【讨论】:

【参考方案3】:

对于 Windows 操作系统,如果您愿意使用其他工具和可能的框架,我有一个解决方案。试试“peresembed”工具。它将文件嵌入到 PE 图像部分,因此您可以将所有图像、声音和配置文件放在一个 EXE 文件中。也支持压缩,虽然你确实需要一个 ZIP 内存读取框架。甚至可以根据文件的相对路径将文件嵌入到 PE 资源树中。

示例用法:

peresembed -file content.txt _export_to_resolve input.exe output.exe

在您的 C++ 文件中,您有:

struct embedded_data

    void *dataloc;
    size_t datasize;
;

extern "C" __declspec(dllexport) const volatile embedded_data _export_to_resolve =  0 ;
从以下位置获取 peresembed:https://osdn.net/projects/pefrm-units/releases/70746 展示视频:https://www.youtube.com/watch?v=1uYdjiZc5XI

【讨论】:

以上是关于如何将资源嵌入到单个可执行文件中?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将 Electron 应用程序和数据文件嵌入到单个可执行文件中?

使用 CMake 将资源(例如,着色器代码;图像)嵌入到可执行文件/库中

使用 GCC 在可执行文件中嵌入资源

将 sqlite 数据库嵌入到 c++ 可执行文件中

xml 如何使用Ant将Java程序捆绑到单个可执行.jar文件中

如何仅部署单个可执行文件