使用Fortran调用C ++函数

时间:2010-03-22 20:32:56

标签: c++ fortran

我正在尝试使用一些FORTRAN代码来调用我编写的几个c ++函数(c_tabs_就是其中之一)。链接和一切工作正常,只要我调用的函数不属于类。

我的问题是我希望FORTRAN代码调用的函数属于一个类。我使用nm查看符号表,函数名称就像这样丑陋:

00000000 T _ZN9Interface7c_tabs_Ev

FORTRAN不允许我用这个名字来调用一个函数,因为开头有下划线,所以我很茫然。

当c_tabs不在类中时,它的符号非常简单,FORTRAN没有问题:

00000030 T c_tabs_

有什么建议吗?提前谢谢。

4 个答案:

答案 0 :(得分:7)

这个名称被破坏了,这就是C ++编译器所做的功能,允许函数重载和类型安全链接等功能。坦率地说,你极不可能从FORTRAN调用成员函数(因为FORTRAN不能创建C ++类实例,除其他原因外) - 你应该用C API来表达你的接口,它可以从几乎任何地方调用。

答案 1 :(得分:4)

你需要创建一个c风格的界面和“extern”它。 C ++破坏了用于链接的方法名称(和重载函数)。将C ++与C ++之外的任何东西联系起来都是非常困难的。有“方法”,但我强烈建议您只需导出C接口并使用Fortran中提供的标准工具。

答案 2 :(得分:3)

你必须创建extern "C"包装器来处理FORTRAN调用C ++的所有细节,名称修改是最明显的。

class foo {
public:
    int a_method (int x);
}

extern "C" int foo_a (foo * pfoo, int * px) {
    if (NULL == pfoo)
        return 0;
    else
        return pfoo->a_method (*px);
}

请注意,FORTRAN编译器通过引用传递所有参数,而不是通过值传递。 (虽然我被告知这并不严格地说是FORTRAN标准的一部分。)

答案 3 :(得分:3)

如果您使C ++例程具有C风格的接口(如已经描述的那样),那么您可以使用Fortran 2003的ISO C绑定功能来调用它。使用ISO C Binding,您可以指定例程的名称和(在限制范围内)参数和函数返回的C类型和调用约定(引用,按值)。这种方法运行良好,并且具有标准的优点,因此与编译器和平台相关,不像从Fortran调用C的旧方法。许多Fortran 95编译器支持ISO C绑定,例如gfortran> = 4.3。