这个问题已经在这里有一个答案:
- 是否有一个Linux等效的Windows的‘资源文件’? 2个回答
我正在寻找一种方式嵌入在我的二进制文件的文本文件(如Windows资源系统)。 我需要的东西,那也独立于平台的(工作在Windows和Linux)。 我找到的是Qt资源管理是什么,我需要,但我视Qt的仅此一点我并不热衷于我的应用程序。 我也发现这个工具http://www.taniwha.com/~paul/res/ ..但它是太具体的平台。
这个问题已经在这里有一个答案:
我正在寻找一种方式嵌入在我的二进制文件的文本文件(如Windows资源系统)。 我需要的东西,那也独立于平台的(工作在Windows和Linux)。 我找到的是Qt资源管理是什么,我需要,但我视Qt的仅此一点我并不热衷于我的应用程序。 我也发现这个工具http://www.taniwha.com/~paul/res/ ..但它是太具体的平台。
所述xxd
工具可以用来创建一个C源文件,其中包含的二进制文件的斑点为阵列(与-i
命令行选项)。 你可以编译到链接到你的可执行文件的对象。
xxd
应该被移植到大多数平台。
如果你使用QT 4.5,你可以确保该程序只依赖于一个小片QT,如libqtcore。 QResource是libqtcore的一部分。
您可以simlpy各种数据追加到正常的二进制文件。 工程在Windows和Linux。 你必须在运行时打开自己的二进制文件,并从那里读取数据。
然而,我不得不承认,在二进制文件中嵌入数据是一个奇怪的想法。 这是常见的做法包括这样的数据与应用程序打包的单独的文件。
这不是个好主意。 在Linux上,例如,数据预计将安装在“$ DATADIR”,这是在默认情况下,被定义为“$前缀/股”,其中“$前缀”是安装前缀的子目录。 在Mac OS X,预计资源将安装在$的appbundle /内容/资源,其中$的appbundle是“的.app”结束文件夹的名称。 在Windows上,是可执行文件的兄弟文件夹中安装的数据是不是一种罕见的做法。 您可能会更好使用CMake的构建系统,并使用其CPack包装特性安装/默认捆绑,优选的特定平台的方式。
虽然捆绑你的资源到可执行文件本身可能看起来很酷,它其实是一个危险的想法......例如,将嵌入的数据在可执行页面被分配? 如果尝试覆盖或修改数据会发生什么? 如果你想怎么调整或在运行时修改数据? 事情要考虑。
这看起来非常有前途: https://github.com/cyrilcode/embed-resource
CMake的基础与平台无关。
正如我也不喜欢将文件转换成C数组的想法只是让他们转换回二进制文件,我创建了使用LLVM和锵我自己的资源编译器:
https://github.com/nohajc/resman
我测试了它在Windows,Linux和MacOS,但它可能被LLVM支持的任何平台上运行。
它是这样使用:
#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
...
运行资源编译器
$ rescomp res_list.h -o res_bundle.o
链接res_bundle.o到项目
#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();
资源编译器解析res_list.h(使用锵),但不是生成cpp文件,它会直接到原生对象文件(或静态库)格式(使用LLVM)。