2

我正在寻找一种方法,如何将 c++ 代码与 fortran 代码集成(我只想在 fortran 代码中调用一些 C/C++ 函数)。

我找到了一些关于 gcc 或控制台编译器的建议,但我不知道如何翻译这种方法来解决 Visual Studio 中的集成问题。

当时我正在考虑创建一个 dll 形式的 c++ 代码并从 Fortran 代码中调用它。

有人已经看到解决方案了吗?或者从 dll 调用函数的开销是什么?我的 fortran 代码将大量内存转移到 C 函数中,是否有任何问题,如果我会用 dll 解决这个问题?

谢谢。

PS 我正在使用 Visual Studio 2008 Prof 和 Intel 编译器 10

PPS 我认为,我必须更具体地指定我想要的:我想在 Visual Studio 中编译一个 fortran 项目,它使用一些 C 函数。

4

6 回答 6

4

有一种新方法可以做到这一点,它有很多优点——使用 Fortran 2003 ISO C 绑定。这是连接 Fortran 和 C(以及任何将使用 C 调用约定的语言)的标准,因此很大程度上与操作系统和语言无关。Intel Fortran 11 支持许多其他编译器——不确定版本 10。使用 ISO C 绑定,您可以匹配任何 C 名称(任何大小写),不必担心下划线(以及编译器之间的变化),并且可以指定参数的类型和调用方法(按引用、按值)。英特尔在其编译器的文件夹中提供了一些示例;gfortran 手册中也有示例,并讨论了 Windows 的其他注意事项。此处和英特尔 Fortran 论坛上有以前的问题和答案。

于 2010-06-28T19:46:57.770 回答
2

大约 20 年前,我集成了 C 和 Fortran,并在 5 年前一直保持这种集成。我使用的技巧是:

  • 我注意到 Fortran 编译器将所有符号都用大写,所以要确保你的 C/C++ 函数也用大写。要验证符号是如何放入 .OBJ 文件中的,请使用 DUMPBIN。
  • Fortran 编译器不理解 C++ 编译器所做的名称修改。使用 C 风格约定编译所有 C++ 函数(使用 extern "C")
  • Fortran 中的参数总是使用引用/指针放在堆栈上。因此,在 C 函数中使用指针参数。

老实说,当我切换到 VS2005 时,我放弃了 C 和 Fortran 的集成,所以从那时起情况可能会发生变化。尽管如此,使用 DUMPBIN 查看 Fortran 编译器生成的符号类型并调整 C/C++ 源代码的编译以适应它仍然是一个好主意。

于 2010-06-28T19:09:02.073 回答
2

我们在我工作的地方做。

假设您使用的是 Intel Fortran 编译器,请查看其文档。默认情况下,英特尔 Fortran 通过引用传递所有内容,并且(我相信)使用 C 调用约定,并带有一个全部大写的标识符。字符串是一个特殊的问题,因为 Fortran 喜欢将长度作为隐藏参数传递,并通过编译器设置它在参数列表中的位置。

聪明的程序员不依赖默认值(错误会导致未定义的行为),并且会使用 intelINTERFACE语句来指定调用约定、参数传递和例程的链接名称。此页面上的信息(属性属性和调用约定)是必读的。特别是,您需要它来了解何时何地传递字符串长度参数的神秘规则。我有一份打印出来的,我随身携带。:-)

需要注意的另一件事是 VisualStudio 6 以后的版本不喜欢混合的 Fortran 和 C 项目。我们通过创建调用 makefile 的自定义项目文件解决了这个问题,但那是一个 PITA。我建议顺其自然并使用单独的项目,除非您像我们一样这样做。

于 2010-06-28T19:29:00.543 回答
1

找到的解决方案: 解决方案链接

我有几个链接问题,可以通过添加项目属性来解决。

测试代码:

#include <stdio.h>

extern "C"
{
    void f() 
    {
        printf("hi from c\n mega test");
    }
}

fortran 代码

PROGRAM HelloWorld
use, intrinsic :: iso_c_binding
implicit none 
interface
    subroutine f( ) bind( c )
        use, intrinsic :: iso_c_binding
    end subroutine f   
end interface  
call f
END PROGRAM HelloWorld

根据需要,我可以上传测试项目。谢谢大家,希望这是我使用 c 和 fortran 的最后一个问题

于 2010-06-29T16:15:13.700 回答
1

多亏了Visual Express 2010 的自定义构建工具,我能够从 fortran 源代码构建 obj 。我想这在 Visual Studio 中也是可能的。

如果您想将 C 和 Fortran 混合在一起,这里有一个很好的教程。它是为 gcc 编译器编写的,但您应该能够轻松学习如何处理名称修改。

根据编译器的不同,编译的子例程/函数是大写/小写,带有尾随下划线,带有前导下划线,... 对于成功的链接,您可以使用 dumpbin 工具查看名称在目标文件中的显示方式。

另一种方法是使用iso_c_binding模块,但它仅适用于 Fortran 2003。

于 2012-12-10T20:13:48.490 回答
0

这就是它与 gcc 和控制台的工作方式

抄送:

#include <stdio.h>

void f_()
{
    printf("Hi from C\n");
} 

fortran.f90

PROGRAM HelloWorld
   CALL f
END PROGRAM HelloWorld

生成文件

SRCDIR=.

all: clean release run

release:
    gcc -c c.c -o c.out 
    gfortran -c fortran.f90 -o fortran.out
    gfortran -o out.exe fortran.out c.out
run:
    out.exe

clean:
    @$(ZSHMAGIC)  rm -rf *.exe core* *.o a.out 2> /dev/null

另一个问题:我是否总是在我在 fortran 程序中使用的 c 函数名称后添加“_”?

于 2010-06-28T19:09:40.670 回答