【问题标题】:How do I bundle/include and use files into an executable in C - linux?如何将文件捆绑/包含并使用到 C - linux 中的可执行文件中?
【发布时间】:2020-07-10 02:49:01
【问题描述】:

我已经用谷歌搜索了一段时间,但我似乎没有得到任何类似于我所要求的内容。

我正在创建一个非常简单的 C 脚本,它创建了一堆模板文件(它们都不是代码或库或任何东西,它们只是 txt 文件),这取决于通过控制台传递的参数,我的方式要解决这个问题是只使用 fopen 和 fwrite,基本上逐行组装文件,只替换我需要的文件,但我认为必须有一种方法将一些文件捆绑到代码中,这样我就可以打开并替换什么需要因情况而异。

我想我也可以创建几个 const char *file_text 就可以了,但是我想知道如果需要使用比 text 更难处理的东西,我的要求是否可行出现。

问题是我似乎无法找到,明确地说,我想在控制台上做这样的事情: ./Gen.sh 项目名称

并且让 Gen.sh 成为一个独立的文件,无需将原始模板保存在同一个文件夹中。

【问题讨论】:

  • 注意:没有“C 脚本”之类的东西。 C 不是脚本语言。它必须被编译,否则它不会做任何事情。话虽如此,为什么要使用 C 而不是 Python、Ruby、Perl 甚至 Bash 等更宽容的东西?
  • 您可以编写一个快速构建脚本来将任意文件转换为 C 字符串常量,然后将它们编译到您的代码中,但目前尚不清楚这比拥有一个充满纯文件的目录更好无需重新编译即可轻松编辑和调整。
  • 我的意思是让它通过这样的方式编译成输出:gcc -Wall -o Gen.sh -main.c
  • 是的,但是因为当你必须重复输入所有这些内容时会非常痛苦,通常你会设置一个Makefile 或类似的东西。
  • xxd -i somefile 输出将文件内容表示为无符号字符数组的 C 代码。

标签: c linux file


【解决方案1】:

您可以使用linker to do such embedding

$ ld -r -b binary cat.png -o cat.o

目标文件将包含三个符号,

$ nm cat.o
_cat_start
_cat_end
_cat_size

要从 C 中使用它们,请声明一些 extern 变量

extern const char cat_start;
extern const char cat_end;
extern const int cat_size;

然后你可以链接生成的目标文件,同样可以用于文本文件

【讨论】:

  • 这会将文件内容包含在进程的内存空间中。访问它很方便。但是,如果您有几十个文件,您的流程足迹就会增加。您是否知道一种仅将一个特定文件映射到按需进度的方法?
  • 这正是我想做的;稍后我将不得不尝试此操作,因为我使用了上述建议之一来解决问题,尽管我认为代码与原来的代码没有太大不同。如果有人想检查“解决方案”:github.com/CrainFartor/CPPTemplatleProjectFileGenerator
  • @harper 您可以随时使用压缩数据,也可以使用动态库(哪种方式违背了目的)
  • 在动态数据的情况下,我在进程内存中有所有文件(压缩),另外我需要一个库来解压它。
  • @harper 它真的取决于你的目标是什么,你的约束是什么,但如果你想“将文件与可执行文件捆绑在一起”,你必须选择一些折衷方案。否则,只需将您的文件放入可执行文件旁边的 .zip 或 .tar 存档中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
  • 2014-11-21
  • 2011-09-25
相关资源
最近更新 更多