在可以链接到c ++的语言上

时间:2009-03-07 00:36:30

标签: c++ linker

正如我在这个主题上的反思一样,在我看来,如果一种语言是用C ++实现的,它很可能有一种链接到C ++的机制。我记得,Java是通过JNI的方式,但我真的不记得它是通过C ++还是普通的C.

但是,通常语言似乎没有链接到C ++,并且由于各种原因只能通过C访问C ++。

所以,出于好奇,

哪些语言可以链接到C ++以及如何以及在多大程度上?

(除非以优雅或有趣的方式完成,例如Boost.Python,否则上述C桥没有功劳)

3 个答案:

答案 0 :(得分:11)

注意:ABI包括名称修改以及调用约定,环境要求等.EABI(此处未涉及)是特定于平台的,但通常针对每个平台进行标准化(但不保证这一点)并且没有遭受可变的EABI的问题(因为它没有太大变化)。有关此主题的更多信息,请参阅ABI on Wikipedia

链接到C ++不太可能,因为ABI未定义。因此,符号的名称可以根据编译器供应商的意愿而改变。例如,GCC与MS的编译器不同。即使使用相同的编译器,ABI在版本之间也可能不同(与某些GCC版本的情况一样)。

然而,链接到C ++并非不可能。 C ++程序链接到其他C ++程序是很常见的,因为它们都是由相同的编译器(或至少使用相同ABI的编译器)编译的。如果ABI是已知的,则非C ++应用程序可以链接到C ++应用程序。

轻松链接到C 。这是因为对于大多数平台来说, C的ABI比C ++的ABI更稳定。这是因为与C ++相比,C的简单性。因为C ++可以导出C符号,绕过C ++的ABI问题,所以有时会看到C ++库导出C符号,这些符号允许与底层C ++对象进行交互,而不会出现名称损坏,链接兼容性和面向未来的问题。但是,这样做可以防止您通过C接口通过C接口轻松使用C ++库。

您可以使用C exports 来使用C ++界面。该库可以在头文件中提供一些类,为您包装C导出。这是对图书馆作者的更多工作(并且可能会导致一些问题,因为DRY通常不会使用这种技术),但为图书馆用户提供了很多好处(可以在两个界面之间进行选择而不必担心链接问题!)。对于其他语言,库编写者可以提供类似C ++头文件的接口,这些文件处理C导出本身。 (然后您可以使用本机类等。)

答案 1 :(得分:6)

没有语言可以做得很好,因为 the C++ standard does not specify a name mangling scheme 。因此,不同的编译器可以自由地修改名称,并且没有一致的方法来链接到C ++二进制文件。

这么多东西可以链接到C的原因是因为C具有简单且一致的链接。函数foo在对象文件中称为foo。同样,事情可以很好地链接到Fortran,因为foofooFOOfoo_foo__之一。

这就是为什么有很多C ++对象的包装器生成器(SWIGBoost.PythonSIP等)。他们将界面定义为一组 C 调用,因为这样可以轻松链接。

要记住的其他事项是真的是否要直接链接到C ++库。生成包装器时,许多包装器生成器提供了许多策略选项。请记住,C调用归结为函数,但C ++调用通常需要导航很多OO语义。您需要指定如何使用宿主语言对C ++对象进行垃圾收集,如何复制内容,vptrs的位置,对象的布局方式,对象的分配位置以及宿主语言的对象模型与对象模型之间的所有细微差别。 C ++。

我知道只是链接到C ++库并完成它是理想的,但它不那么简单,并且你最终还是想要不仅仅是直接链接

答案 2 :(得分:3)

最近看了SWIG