调用C / C ++代码构成visual studio中的fortran程序? (如何在visual studio中编译混合C和fortran代码)

时间:2010-06-28 18:58:28

标签: c++ c visual-studio fortran fortran-iso-c-binding

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

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

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

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

THX。

PS 我正在使用Visual Studio 2008教授和英特尔编译器10

PPS 我想,我必须指定更具体,我想要的东西:我想在visual studio中编译一个fortran项目,它使用一些C函数。

6 个答案:

答案 0 :(得分:4)

有一种新方法可以做到这一点有很多优点 - 使用Fortran 2003 ISO C Binding。这是一个标准,因此主要是操作系统和语言独立的方式来连接Fortran和C(以及任何将使用C调用约定的语言)。英特尔Fortran 11支持许多其他编译器 - 不确定版本10.使用ISO C绑定,您可以匹配任何C名称(任何情况),不必担心下划线(和编译器之间的变化)和can为参数指定类型和调用方法(通过引用,按值)。英特尔在其编译器的文件夹中提供了一些示例; gfortran手册中还有一些示例,并讨论了Windows的其他注意事项。有以前的问题&这里以及英特尔Fortran论坛上的答案。

答案 1 :(得分: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 ++源代码的编译以适应它。

答案 2 :(得分:2)

我们在工作的地方这样做。

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

明智的程序员不依赖于默认值(错误会导致未定义的行为),并且将使用intel INTERFACE语句来指定调用约定,参数传递和例程的链接名称。关于this page (ATTRIBUTES Properties and Calling Conventions)的信息是必读的。特别是你需要它来理解传递字符串长度参数的时间和位置的神秘规则。我有一个打印输出,我保留在我的人身上。 : - )

另外需要注意的是,过去6年的VisualStudio版本不喜欢混合的Fortran和C项目。我们通过创建调用makefile的自定义项目文件解决了这个问题,但这是一个PITA。我建议使用流程并使用单独的项目,除非你像我们这样做很多

答案 3 :(得分:1)

发现解决方案: solution link

我遇到了一些链接问题,可以通过添加项目属性来解决。

测试代码:

#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的最后一个问题

答案 4 :(得分:1)

由于Visual Express 2010的Custom Build Tools,我能够从fortran源构建obj。我想在Visual Studio中也可以。

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

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

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

答案 5 :(得分:0)

这是gcc和console

的工作原理

C.C:

#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

另外一个问题:我总是在c函数名之后添加'_',我在fortran程序中使用它吗?