平台独立资源管理

时间:2009-11-01 11:49:02

标签: linux unix resources

我正在寻找一种在我的二进制文件中嵌入文本文件的方法(比如windows资源系统)。我需要一些平台独立的东西(适用于Windows和Linux)。我发现Qt资源管理是我需要的,但我并不热衷于我的应用程序,具体取决于Qt。我还在http://www.taniwha.com/~paul/res/找到了这个工具..但它太具体了。

6 个答案:

答案 0 :(得分:4)

xxd实用程序可用于创建C源文件,其中包含二进制blob作为数组(使用-i命令行选项)。您可以将其编译为链接到可执行文件的对象。

xxd应该可以移植到大多数平台上。

答案 1 :(得分:1)

如果您使用的是QT 4.5,则可以确保该程序仅依赖于一小块QT,例如libqtcore。 QResource是libqtcore的一部分。

答案 2 :(得分:1)

您可以将各种数据附加到普通二进制文件中。适用于Windows和Linux。您必须在运行时打开自己的二进制文件并从那里读取数据。

但是,我必须同意在二进制文件中嵌入数据是一个奇怪的想法。通常的做法是将这些数据作为与应用程序打包在一起的单独文件包含在内。

答案 3 :(得分:0)

这不是一个好主意。例如,在Linux上,数据预计安装在“$ datadir”的子目录中,默认情况下,该子目录定义为“$ prefix / share”,其中“$ prefix”是安装前缀。在Mac OS X上,资源预计将安装在$ appbundle / Contents / Resources中,其中$ appbundle是以“.app”结尾的文件夹的名称。在Windows上,在可执行文件的兄弟文件夹中安装数据并不是一种罕见的做法。您可能最好使用CMake构建系统,并使用其CPack打包功能以默认的首选平台特定方式安装/捆绑。

虽然将资源捆绑到可执行文件本身可能看起来很酷,但这实际上是一个危险的想法......例如,嵌入式数据是否会在可执行页面中分配?如果您尝试覆盖或修改数据会发生什么?如果要在运行时调整或修改数据,该怎么办?需要考虑的事情。

答案 4 :(得分:0)

这看起来很有希望:https://github.com/cyrilcode/embed-resource

基于CMake且与平台无关。

答案 5 :(得分:0)

由于我也不喜欢仅将文件转换回C数组的想法,所以我使用LLVM和Clang创建了自己的资源编译器:

https://github.com/nohajc/resman

我在Windows,Linux和macOS上对其进行了测试,但是它可以在LLVM支持的任何平台上运行。

它的用法如下:

  1. 创建头文件,例如 res_list.h
#pragma once
#include "resman.h"

// Define a global variable for each file
// It will be used to refer to the resource
constexpr resman::Resource<1> gRes1("resource_file1.jpg"); // resource with ID 1
constexpr resman::Resource<2> gRes2("resource_file2.txt"); // resource with ID 2
constexpr resman::Resource<3> gRes3("resource_file3.mp3"); // resource with ID 3
...
  1. 运行资源编译器

    $ rescomp res_list.h -o res_bundle.o

  2. 将res_bundle.o链接到您的项目

  3. 使用资源文件
#include "res_list.h"
...
resman::ResourceHandle handle{gRes1};

// ResourceHandle provides convenient interface to do things like:

// iterate over bytes
for (char c : handle) { ... }

// convert bytes to string
std::string str{handle.begin(), handle.end()};

// query size and id
unsigned size = handle.size();
unsigned id = handle.id();

资源编译器(使用Clang)解析 res_list.h ,但它不生成cpp文件,而是直接转换为本机目标文件(或静态库)格式(使用LLVM)。