在 C 应用程序中包含其他语言的库

Include libraries in other languages in a C application

我的一般问题是:在 C 应用程序中包含其他语言的库的最常见方法是什么?

例如,如果我有一个 Ruby 库用于执行函数 X,还有一个 Python 库用于执行函数 Y,我该如何编写一个使用每个函数的 C(即语言)程序?

我见过可以访问这些高级语言中的 C 库的包装器,但是是否有相反的包装器?是否有通用的一般处理方法?

这些是本机代码库(即它们是否已编译?)还是这些源库(即一堆包含 Ruby 源代码的文本文件)?

如果是前者,Ruby 或 Lua 等语言的库通常有一个已发布的二进制接口 ("ABI")。这是低级文档,描述了它们的库及其功能如何在幕后工作。通常,这些是用 C 或 C++ 定义的,或者用于为 Ruby 本身实现 interpreter/compiler 的任何语言。

所以你必须找到那个文档,并找出如何调用你感兴趣的部分。有些语言甚至使用与 C 相同的 ABI,你只需要创建一个匹配的头文件库的内容,您可以直接调用它(这就是您集成汇编程序和 C 甚至 C++ 的方式,您可以直接生成 C 函数)。

如果是后者,您通常需要找到该语言的可嵌入版本,并找出如何从您的应用程序内部 运行 脚本(这就是 Lua 通常使用的方式,例如)。

但是您确定需要给定的 Ruby 库吗?通常,公共库是在后台使用 C 或 C++ 库实现的,然后只是为脚本语言包装,因此您可以跳过脚本翻译层并自己使用(可能稍微低级)库。

PS - 还有自动包装器生成器,如 SWIG,可以读取一种语言的文件并为您编写翻译代码。