【问题标题】:Is there a Linux equivalent of Windows' "resource files"?是否有相当于 Windows 的“资源文件”的 Linux 版本?
【发布时间】:2011-01-01 02:46:25
【问题描述】:

我有一个 C 库,我将其构建为 Linux 的共享对象和带有 MinGW32 的 Windows 的 DLL。 API 依赖于几个数据文件(统计模型),我真的很想将它们与 SO/DLL 一起使用,以便部署只是一个文件。

看起来我可以使用windres 编译的“资源文件”在 Windows 上实现这一点,但是我必须为 Windows 编写一堆资源处理代码,我仍然坚持Linux 上的文件。

有没有办法在 Linux 上实现相同的功能?

更好的是,有便携式解决方案吗?

【问题讨论】:

  • 类似(可能重复):stackoverflow.com/questions/1656968/… 可能还有其他,但这是一个很难搜索的主题...
  • 虽然不投票赞成,但对现有问题的回答只是微不足道。
  • 如果您能告诉我们您想要编写什么(便携式)代码来访问数据文件,那将非常有帮助。 fopenfread 根本不能在内存块上工作,至少在我知道的任何系统上都不能。
  • @Norman:我正在使用 C++ 来实现库(虽然它只导出 C 函数,为了 ABI 兼容性)所以我可以从二进制数据构造一个 stringstream 然后它的行为就像反正一个文件。还值得注意的是,使用 avr-libc(可能还有其他针对微控制器的 libcs​​),您实际上可以通过提供您自己的 getc()putc() 通过函数指针使 fread() 在任意内存块(或其他任何东西)上工作fdevopen() 函数(fopen() 没有操作系统就没有多大意义,更不用说文件系统了)。

标签: gcc cross-platform embedded-resource


【解决方案1】:

在 Linux 和其他 ELF 系统上实际上非常简单:http://www.linuxjournal.com/content/embedding-file-executable-aka-hello-world-version-5967

OS X 具有捆绑包,因此您只需将库构建为框架并将文件放入捆绑包中。

【讨论】:

  • 这种方法是否也适用于构建 Windows DLL?这似乎是一个不错的简单选择。
  • 我不知道,我从来没有为 Windows 构建过任何东西,对链接器的工作原理一无所知。
  • 您仍然会遇到一个问题,即访问文件中数据的 API 与访问内存中命名块的 API 不同。但如果你能忍受,你就不需要objcopy;您可以轻松编写一个从任何二进制文件生成 .c 文件的简短脚本。例如,cs.tufts.edu/~nr/drop/lua/lua2c;使用 -s 选项运行脚本。
  • @Norman:不利的一面是额外的二进制→转义的 C→二进制步骤需要时间和内存;这对于大二进制 blob 变得很明显。 (并不是说您应该嵌入它们;在所有情况下,我都倾向于将东西粘贴在 $PREFIX/share 中,但显然 OP 不太喜欢这样。)
  • $PREFIX/share 解决方案适用于每个人都习惯于安装依赖项的 UNIX,但在 Windows 上,人们真的只想要一个可以通过他们的应用程序重新分发的 DLL(并且没有很好的等价物$PREFIX/share 无论如何)。
【解决方案2】:

两种可能的解决方案:

  • Phong Vo 的 sfio 库是 AT&T 高级软件技术工具集的一部分,是 C stdio.h 的绝佳替代品,它允许您使用单个 API 打开文件或内存块。因此,您可以轻松地将现有文件转换为 C 初始化数据以包含在您的 DLL 或 SO 文件中。

    这是一个很好的跨平台解决方案,但代价是入门的学习曲线非常高。他们不容易弄清楚东西是如何工作的,或者把他们的工具集的一部分分离出来以便独立于其他部分使用。但好消息是,如果你想采用他们的 U/Win 系统在 Windows 上运行 Unix 代码(都是同一个工具集的一部分),你可以使用同一个系统创建 DLL 和 SO。

  • 对于这类问题,我经常求助于Lua;我可以将 Lua 数据存储在外部文件或 C 中作为初始化数据。这非常适合在一个 .so 文件中分发所有内容;我为我的学生这样做。

    同样的缺点是您必须掌握并融入新技术。

在我自己的工作中,我使用 Lua 而非 AT&T 的原因如下:

  • Lua 的占用空间小得多,并且旨在与其他人一起玩;使用 AST,您确实可以采用他们的做事方式。

  • Lua 的学习曲线不那么陡峭;您可以很快提高工作效率。

  • Lua 非常易于安装,并且很容易获得有关它的信息。 AST 有自己的古怪安装过程,世界上没有其他人共享;通常很难进行安装;并且更难获得有关它的信息。

  • 使用 Lua 有很多其他的好处,因此学习 Lua 和学习如何将 Lua 整合到 C 代码中所付出的努力很容易分摊到多个项目中。

【讨论】:

  • 我不明白嵌入脚本语言如何解决嵌入任意文件数据的问题,如果我要嵌入脚本语言,我可能会选择 Python(因为我一直无论如何,最近经常使用 Boost.Python)。 sfio 看起来很方便,但看起来它可能不值得努力重构所有使用它的东西。
  • @cibyr:我的问题是要嵌入什么,而不是如何嵌入。如何将文件嵌入为 C 代码非常非常容易;所有的想法都涉及到你想要字节的 API 的问题。如果你查看cs.tufts.edu/~nr/drop/lua,你会看到一个名为lua2c 的脚本,它可能会给你一些想法。使用-s 选项运行,它将嵌入任何二进制文件,尽管它不是超级有用,因为我生成的 API 试图将文件编译为 Lua 代码。但是一旦你决定了你想要什么 API,我相信你可以在 Python 中做一些事情。如果没有,请发布另一个问题。
  • 我不确定这如何远程接近回答 OP 问题“有没有办法用我的可执行文件添加资源文件”(我的解释)。到目前为止,objcopy 路由似乎比嵌入 lua 合理得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 2022-11-08
  • 1970-01-01
  • 2010-10-24
相关资源
最近更新 更多