是否有一种跨平台的方法可以在使用 C++ 编写的二进制应用程序中嵌入资源?



我正在尝试将一些资源(图像,音乐和数据文件)捆绑到我的二进制应用程序(用C++编写)中。

我想将所有内容都包含在一个可执行文件中(这样我就可以发布(大)可执行文件并且它可以工作,无法删除任何资产)。

我看到Visual Studio和Windows有一些叫做资源文件的东西,看起来像是设计用来做到这一点的。

但是,如果有跨平台的方式,或者如果没有,Linux 等效于资源文件是什么(如果有,请提供我的任何 IDE 或编译器),我很感兴趣。

我希望能够将我的整个程序包含在一个文件中,因此我对单独的资产或资源目录不感兴趣。

我找到了几个较旧的答案,但很难相信在 Linux 上没有现代方法可以做到这一点。

似乎解决方案是:

A. 在 Windows 上使用资源文件

B. 使用将资源转换为 .c 字符数组并在 Linux 上加载它的东西。

这真的需要什么吗,如果是这样:将此过程包含在跨平台构建周期中的最方便方法是什么?在构建程序之前,CMAKE 是否可以运行某些功能?

我见过有人xxd|sed他们的二进制资源到Cconst uint8_t数组中。它可以被 c++化:

Resource1.h

#include <cstdint>
#include <array>
extern std::array<uint8_t, 1024> resource1;

Resource1.cc

#include "Resource1.h"
const std::array<uint8_t, 1024> resource1 = {
0x42, 0x24, 0x18, ...
...
}

如果你不喜欢正则表达式,这里有一个起点:

hexdump file.bin | sed 's/^[0-9a-f]* ?//;s/ ?([0-9a-f]{2}) ?/0x1, /g'

输出类似的东西

0x5b, 0x6b, 0x32, 0x50, 0x69, 0x50, 0x53, 0x64, 0x61, 0x65, 0x63, 0x72, 0x52, 0x68, 0x73, 0x65, 
0x6f, 0x70, 0x73, 0x6e, 0x5d, 0x65, 0x3d, 0x20, 0x30, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 
...

最新更新