我有一个C库,我将其构建为Linux的共享对象和带有MinGW32的Windows的DLL。 API取决于几个数据文件(统计模型),我真的想用SO / DLL进行处理,以便部署只是一个文件。
看起来我可以使用windres
编译的“资源文件”为Windows实现这一点,但是我必须为Windows编写一堆资源处理代码,我仍然卡住了使用Linux上的文件。
有没有办法在Linux上实现相同的功能?
更好的是,有便携式解决方案吗?
答案 0 :(得分:31)
在Linux和其他ELF系统上实际上非常简单:http://www.linuxjournal.com/content/embedding-file-executable-aka-hello-world-version-5967
OS X有捆绑包,因此您只需将您的库构建为框架并将该文件放入捆绑包中。
答案 1 :(得分:-1)
两种可能的解决方案:
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代码中的努力很容易在多个项目中摊销。