一尘不染

带有GCC的C / C ++:将资源文件静态添加到可执行文件/库

linux

有人知道如何使用GCC将任何资源文件静态地直接编译到可执行文件或共享库文件中吗?

例如,我想要添加永不更改的图像文件(如果更改,则无论如何我都必须替换该文件),并且不希望它们位于文件系统中。

如果这是可能的(我认为是因为Windows的Visual C
++也可以这样做),如何加载存储在自己的二进制文件中的文件?可执行文件会自行解析,查找文件并从中提取数据吗?

也许我还没有看到GCC的选择。使用搜索引擎并没有真正吐出合适的东西。

我需要此功能才能用于共享库和普通的ELF可执行文件。

任何帮助表示赞赏


阅读 402

收藏
2020-06-02

共1个答案

一尘不染

使用imagemagick

convert file.png data.h

给出类似的内容:

/*
  data.h (PNM).
*/
static unsigned char
  MagickImage[] =
  {
    0x50, 0x36, 0x0A, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 
    0x77, 0x69, 0x74, 0x68, 0x20, 0x47, 0x49, 0x4D, 0x50, 0x0A, 0x32, 0x37, 
    0x37, 0x20, 0x31, 0x36, 0x32, 0x0A, 0x32, 0x35, 0x35, 0x0A, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,

....

为了与其他代码兼容,您可以使用fmemopen“常规” FILE *对象,也std::stringstream可以使用iostreamstd::stringstream但这并不是很好,您当然可以在可以使用迭代器的任何地方使用指针。

如果您将此参数与automake一起使用,请不要忘记适当地设置BUILT_SOURCES

这样做的好处是:

  1. 您得到了文本,因此可以在版本控制中进行合理的修补
  2. 它是便携式的,并且在每个平台上都有明确的定义
2020-06-02