Gcc 是否存在与Windows“资源文件”相同的Linux版本?

Gcc 是否存在与Windows“资源文件”相同的Linux版本?,gcc,cross-platform,embedded-resource,Gcc,Cross Platform,Embedded Resource,我有一个C库,我为Linux构建了一个共享对象,为使用MinGW32的Windows构建了一个DLL。API依赖于两个数据文件统计模型,我真的很想将它们与SO/DLL一起使用,这样部署就只需要一个文件 看起来我可以通过使用windres编译的资源文件在Windows上实现这一点,但是我必须为Windows编写一系列资源处理代码,而且我仍然坚持使用Linux上的文件 有没有办法在Linux上实现相同的功能 更好的是,有便携式解决方案吗?两种可能的解决方案: Phong Vo的库是AT&T高级软件技

我有一个C库,我为Linux构建了一个共享对象,为使用MinGW32的Windows构建了一个DLL。API依赖于两个数据文件统计模型,我真的很想将它们与SO/DLL一起使用,这样部署就只需要一个文件

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

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


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

两种可能的解决方案:

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

这是一个很好的跨平台解决方案,但代价是入门的学习曲线相当高。他们不容易弄清楚东西是如何工作的,也不容易把工具集的一部分分离出来,独立于其他部分使用。但好消息是,如果您想采用他们的U/Win系统在windows上运行Unix代码,所有这些代码都是同一工具集的一部分,那么您可以使用相同的系统创建DLL和SOs

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

同样,缺点是你必须掌握并融入新技术

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

Lua的占地面积要小得多,设计的目的是与其他人一起玩得很好;有了AST,你真的必须采用他们的做事方式

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

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

使用Lua还有很多其他好处,因此学习Lua和学习如何将Lua合并到C代码中所花费的精力很容易在多个项目中摊销


在Linux和其他ELF系统上实际上非常简单:


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

类似的可能的dup:和其他,但这是一个很难搜索的主题…但不投票选择close,对现有问题的回答只是略微有用。如果你能告诉我们你想要写什么样的可移植代码来访问数据文件,那将大有帮助。FOpenD和FRAAD不可能在内存块上工作,至少在我意识到的任何系统上都不行。诺尔曼:我使用C++来实现这个库,虽然它只输出C函数,但是对于ABI兼容性,我只能从二进制数据构建一个StrueFrand,然后它像一个文件一样运行。还值得注意的是,使用avr libc和其他可能针对微控制器的libc,您实际上可以通过向fdevopen函数提供自己的getc和putc,从而使fread在任意内存块或任何其他块上工作。如果没有操作系统,fopen函数没有多大意义,更不用说文件系统了。这种方法是否也适用于构建Windows DLL?这似乎是一个好的、简单的选择。我不知道,我从来没有为Windows构建过任何东西,也不知道链接器是如何工作的。您仍然会遇到一个问题,即访问文件中数据的API与访问内存中命名块的API不同。但如果你能接受,你就不需要objcopy;您可以轻松编写一个简短的脚本,从任何二进制文件生成.c文件。例如:;使用-s选项运行脚本。@Norman:缺点是额外的二进制代码→逃逸C→二进制步骤需要时间和内存;对于大的二进制blob,这一点变得很明显。并不是说你应该嵌入它们;在任何情况下,我都倾向于使用$PREFIX/share,但OP显然不太喜欢它。$PREFIX/share解决方案适用于UNIX,在UNIX中,每个人都习惯于安装依赖项,但在Windows上,人们真正想要的只是一个DLL,他们可以用自己的应用程序重新分发,而且没有一个好的$PREFIX/share等价物。我不知道嵌入脚本语言如何解决嵌入任意文件数据的问题,如果我要嵌入一种脚本语言,我可能会使用Python,因为我最近一直在使用Boost.Python。sfio看起来很方便,但似乎不值得花时间重构所有使用它的东西。@cibyr:My asnwer b
关注嵌入的内容,而不是如何嵌入。如何嵌入一个文件作为C代码是非常,非常容易;所有这些想法都涉及到了一个问题,即您希望字节使用什么API。如果您查看,您将看到一个名为lua2c的脚本,它可能会给您一些想法。使用-s选项运行,它将嵌入任何二进制文件,尽管它不是非常有用,因为我生成的API试图将文件编译为Lua代码。但一旦你决定了你想要什么样的API,我相信你可以用Python做些什么。如果没有,发布另一个问题。我不确定这是如何接近回答OP问题的,有没有一种方法可以用我的可执行文件我的解释添加资源文件。到目前为止,objcopy路径似乎比嵌入lua更合理。