猿问

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

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

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

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

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

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

我需要这个用于共享库和普通的ELF可执行文件。

任何帮助表示赞赏


梵蒂冈之花
浏览 1139回答 3
3回答

慕哥9229398

使用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使用iostream。std::stringstream虽然不是很好,你当然可以在任何可以使用迭代器的地方使用指针。如果你在automake中使用它,请不要忘记适当地设置BUILT_SOURCES。这样做的好处是:你得到文本,所以它可以在版本控制和补丁明智它在每个平台上都是可移植的并且定义良好

智慧大石

我已经开始喜欢John Ripley&nbsp;.incbin基于程序集的解决方案提供的控件,现在使用一个变体。我使用objcopy(GNU binutils)将文件foo-data.bin中的二进制数据链接到可执行文件的数据部分:objcopy&nbsp;-B&nbsp;i386&nbsp;-I&nbsp;binary&nbsp;-O&nbsp;elf32-i386&nbsp;foo-data.bin&nbsp;foo-data.o这为您提供了一个foo-data.o可以链接到可执行文件的目标文件。C界面看起来像/**&nbsp;created&nbsp;from&nbsp;binary&nbsp;via&nbsp;objcopy&nbsp;*/extern&nbsp;uint8_t&nbsp;foo_data[]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm("_binary_foo_data_bin_start");extern&nbsp;uint8_t&nbsp;foo_data_size[]&nbsp;asm("_binary_foo_data_bin_size");extern&nbsp;uint8_t&nbsp;foo_data_end[]&nbsp;&nbsp;asm("_binary_foo_data_bin_end");所以你可以做类似的事情for&nbsp;(uint8_t&nbsp;*byte=foo_data;&nbsp;byte<foo_data_end;&nbsp;++byte)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;transmit_single_byte(*byte);}要么size_t&nbsp;foo_size&nbsp;=&nbsp;(size_t)((void&nbsp;*)foo_data_size);void&nbsp;&nbsp;*foo_copy&nbsp;=&nbsp;malloc(foo_size);assert(foo_copy);memcpy(foo_copy,&nbsp;foo_data,&nbsp;foo_size);如果您的目标体系结构对存储常量和可变数据的位置有特殊约束,或者您希望将该数据存储在.text段中以使其适合与程序代码相同的内存类型,则可以objcopy更多地使用这些参数。
随时随地看视频慕课网APP
我要回答