独立于平台的资源系统(如Qt资源系统)

时间:2009-12-15 09:38:57

标签: c++ resources embedded-resource

C ++是否有与Qt一起提供的平台无关资源系统(但没有Qt依赖关系)?

我想从我的C ++源代码中访问任意数据。也就是说,不仅是图标,还有翻译或着色器等。

或者某种类型的虚拟文件系统库可以访问,例如ZIP压缩文件等也符合我的需要。

4 个答案:

答案 0 :(得分:9)

我为C ++ Web服务器项目推出了自己的系统,该项目基本上采用了大量文件(HTML,CSS,JS,PNG等)并创建了包含编码为static const char*的数据的C ++标头。然后我#include那些我需要访问数据的标题。编码“资源”文件的应用程序作为预构建步骤执行。编码应用程序本身使用boost::filesystem来创建资源标头,因此适用于Windows / * nix。

典型的资源文件可能如下所示:

namespace resource
{
  // Generated from mainPage.htm
  static const char* mainPage_[] =
  {
    "<html>...</html>"
  };
}

对于二进制内容,我使用\x表示法进行编码。我还确保对数据进行换行,以便在编辑器中可读。

我确实遇到了一些问题 - MS编译器不允许static const char*大于64Kb,这是一个PITA。幸运的是,唯一比这更大的文件是我可以轻松拆分成较小块的JavaScript文件 - 但是大图像会成为问题。

答案 1 :(得分:1)

xxdthis question的回答是您正在寻找的。

答案 2 :(得分:0)

我们正在使用ICU ResourceBundle,并且非常满意。

使用pkgdata tool,ResourceBundles的打包非常灵活:作为共享库,静态库或可由ICU进行内存映射的文件。

答案 3 :(得分:0)

我刚刚在链接时将它们作为二进制blob修补到可执行文件的末尾。最后4个字节是前一个块的大小,然后让程序从尾部读取数据项。

如果你需要更多的文件系统类型结构(虽然我没有尝试过),另一种方法是将所有内容放在一个zip文件中并将其追加到最后。再次,你需要一些容易找到的数据添加数据。