【发布时间】:2016-11-04 02:19:50
【问题描述】:
我的一般问题是:在 C 应用程序中包含其他语言的库的最常见方法是什么?
例如,如果我有一个用于执行函数 X 的 Ruby 库和一个用于执行函数 Y 的 Python 库,我如何用 C(即语言)编写一个使用这些函数的程序每一个?
我已经看到了可以访问这些高级语言中的 C 库的包装器,但是是否有相反的包装器?一般有没有通用的处理方法?
【问题讨论】:
我的一般问题是:在 C 应用程序中包含其他语言的库的最常见方法是什么?
例如,如果我有一个用于执行函数 X 的 Ruby 库和一个用于执行函数 Y 的 Python 库,我如何用 C(即语言)编写一个使用这些函数的程序每一个?
我已经看到了可以访问这些高级语言中的 C 库的包装器,但是是否有相反的包装器?一般有没有通用的处理方法?
【问题讨论】:
这些是本机代码库(即它们是否已编译?)还是这些源库(即一堆包含 Ruby 源代码的文本文件)?
如果是前者,Ruby 或 Lua 等语言的库通常具有已发布的二进制接口(“ABI”)。这是描述他们的库及其功能如何在幕后工作的低级文档。通常,它们是用 C 或 C++ 或任何用于为 Ruby 本身实现解释器/编译器的语言定义的。
因此,您必须找到该文档,并找出如何调用您感兴趣的部分。有些语言甚至使用与 C 相同的 ABI,您只需要创建一个与内容匹配的头文件库,您可以直接调用它(这是您集成例如汇编程序和 C 甚至 C++ 的方式,您可以生成直接的 C 函数)。
如果是后者,您通常需要找到该语言的可嵌入版本,并了解如何从应用程序内部运行脚本(例如,Lua 通常就是这样使用的)。
但是您确定需要给定的 Ruby 库吗?通常,通用库是在底层使用 C 或 C++ 库实现的,然后只是为脚本语言包装,因此您可以跳过脚本翻译层并自己使用(可能稍微低级的)库。
PS - 还有一些自动包装器生成器,例如 SWIG,它会读取一种语言的文件并为您编写翻译代码。
【讨论】: