是否有一个平台独立的 C++ 资源系统,就像 Qt 附带的一样(但没有 Qt 依赖项)?
我想从我的 C++ 源代码中访问任意数据。也就是说,不仅是图标,还有翻译或着色器等。
或者,用于访问例如 ZIP 压缩文件等的某种虚拟文件系统库也适合我的需要。
是否有一个平台独立的 C++ 资源系统,就像 Qt 附带的一样(但没有 Qt 依赖项)?
我想从我的 C++ 源代码中访问任意数据。也就是说,不仅是图标,还有翻译或着色器等。
或者,用于访问例如 ZIP 压缩文件等的某种虚拟文件系统库也适合我的需要。
我为一个 C++ Web 服务器项目推出了自己的系统,该项目基本上采用了一堆文件(HTML、CSS、JS、PNG 等)并创建了包含编码为static const char*
. 然后#include
我需要访问数据的那些标题。编码“资源”文件的应用程序作为预构建步骤执行。编码应用程序本身用于boost::filesystem
创建资源标头,因此适用于 Windows/*nix。
典型的资源文件可能如下所示:
namespace resource
{
// Generated from mainPage.htm
static const char* mainPage_[] =
{
"<html>...</html>"
};
}
\x
对于二进制内容,我使用符号进行编码。我还确保对数据进行换行,以便在编辑器中可读。
不过,我确实遇到了一些问题——MS 编译器不允许 astatic const char*
大于 64Kb,这是一个 PITA。幸运的是,唯一比这更大的文件是 JavaScript 文件,我可以轻松地将它们分成更小的块——不过大图像会是个问题。
这个问题的xxd
答案就是你要找的。
我们为此使用了ICU ResourceBundle并且对此非常满意。
使用pkgdata 工具,ResourceBundle 的打包非常灵活:作为共享库、静态库或作为可由 ICU 进行内存映射的文件。
我刚刚在链接时将它们作为二进制 blob 修补到可执行文件的末尾。最后 4 个字节是前一个块的大小,然后让程序从尾部读取数据项。
如果您需要更多的文件系统类型结构(尽管我没有尝试过),另一种方法是将所有内容放在一个 zip 文件中并将其附加到末尾。同样,您需要一些容易找到的添加数据的大小。