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

例如,我想添加永远不会更改的图像文件(如果更改了,我就必须替换该文件),并且不希望它们在文件系统中随处可见.

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

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

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

推荐答案

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上使用这个,别忘了 Select set BUILT_SOURCES.

这样做的好处是:

  1. 你可以将文本输出,这样它就可以在版本控制和补丁程序中合理地运行
  2. 它是可移植的,在每个平台上都有很好的定义

Linux相关问答推荐

在同一目录中未检测到G++预编译头

为什么硬编码的阿拉伯字母与Unicode代码点不具有相同的值

为什么将JAX与Docker一起安装会创建如此大的镜像?

我想显示包含一个方括号的行,方括号可以是开括号,也可以是闭括号.

在 bash 中使用 tee 时如何返回错误代码

ENQCMD 指令的好处和微操作是什么?

我应该如何从非 root Debian Linux 守护进程登录?

Docker 容器立即退出

sed: -i 不能与 Mac OS X 上的标准输入一起使用

使用 awk 或 sed 删除特定字符

为什么在 Linux 中使用 select

Git为每次推送输入长密码

bash 中的sed命令

为什么 Linux 不通过 TSS 使用硬件上下文切换?

模拟器在内核映像文件中找不到Linux 版本字符串

错误:ld.so:无法预加载对象 LD_PRELOAD:忽略

zsh:找不到命令 laravel

为嵌入式 Linux 设备实施更新/升级系统

未找到版本CXXABI_1.3.8(...要求)

Linux 上的 OpenVPN:在命令行中传递用户名和密码