平台无关的资源系统(类似于Qt资源系统)

5

是否有一个与平台无关的资源系统可用于C ++,就像Qt附带的那个(但不需要Qt依赖项)?

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

或者,某种虚拟文件系统库可以访问例如ZIP压缩文件之类的内容,这也符合我的需求。


资源必须嵌入到可执行文件中吗?如果不是,那么另一种方法是使用SQLite来存储文件——使用这个轻量级数据库并不需要太多的努力就可以开始运行。 - Rob
请问如何在 C++ 可执行文件中引入图片资源? - Rob
4个回答

9
我为一个C++ Web服务器项目自己设计了一个系统,基本上是将一堆文件(HTML、CSS、JS、PNG等)打包成C++头文件,其中数据编码为static const char*。然后在需要访问数据的地方#include这些头文件。编码“资源”文件的应用程序作为预构建步骤执行。编码应用程序本身使用boost::filesystem创建资源头文件,因此可在Windows/*nix上运行。
典型的资源文件可能如下所示:
namespace resource
{
  // Generated from mainPage.htm
  static const char* mainPage_[] =
  {
    "<html>...</html>"
  };
}

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

然而,我遇到了一些问题 - MS编译器不允许static const char*大于64Kb,这是一个麻烦。 幸运的是,只有比这更大的文件是JavaScript文件,我可以轻松地将它们分成较小的块 - 大图片会是一个问题。


4
因为我找不到一个跨平台的类似于Qt的资源系统。这就是原因。我给出了一个明智的答案,你却投了反对票?谢谢! - Rob

1

xxd的答案可以在这个问题里找到,这就是你要找的。


0

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

使用pkgdata工具,ResourceBundles的打包非常灵活:可以作为共享库、静态库或可以被ICU内存映射的文件。


0

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

如果您需要更像文件系统类型的结构(虽然我没有尝试过),另一种方法是将所有内容放入zip文件中并将其附加到末尾。同样,您需要一些易于查找的添加数据的大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接