C/C with GCC:静态添加资源文件到可执行文件/库

新手上路,请多包涵

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

例如,我想添加永远不会更改的图像文件(如果他们这样做,我无论如何都必须替换文件)并且不希望它们在文件系统中存在。

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

也许我还没有看到 GCC 的一个选项。使用搜索引擎并没有真正吐出正确的东西。

我需要它来为共享库和普通的 ELF 可执行文件工作。

原文由 Atmocreations 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

使用 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,

....

For compatibility with other code you can then use either fmemopen to get a “regular” FILE * object, or alternatively std::stringstream to make an iostreamstd::stringstream 不是很好,你当然可以在任何可以使用迭代器的地方使用指针。

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

这样做的好处是:

  1. 你得到文本,所以它可以在版本控制和补丁中明智
  2. 它是可移植的,并且在每个平台上都有很好的定义

原文由 Flexo 发布,翻译遵循 CC BY-SA 2.5 许可协议

您可以使用 ld 链接器将二进制文件嵌入到可执行文件中。例如,如果您有文件 foo.bar 那么您可以将其嵌入到可执行文件中,将以下命令添加到 ld

 --format=binary foo.bar --format=default

如果您正在调用 ldgcc 那么您需要添加 -Wl

 -Wl,--format=binary -Wl,foo.bar -Wl,--format=default

这里 --format=binary 告诉链接器以下文件是二进制文件,并且 --format=default 切换回默认输入格式(如果您要在 foo.bar 之后指定其他输入文件,这很有用)。

然后您可以从代码访问文件的内容:

 extern uint8_t data[]     asm("_binary_foo_bar_start");
extern uint8_t data_end[] asm("_binary_foo_bar_end");

还有一个名为 "_binary_foo_bar_size" 的符号。我认为它的类型是 uintptr_t 但我没有检查它。

原文由 Simon 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题