Fortran Coder

标题: 如何实现Fortran和C++/C混合编程? [打印本页]

作者: 安靖    时间: 2014-11-19 14:57
标题: 如何实现Fortran和C++/C混合编程?
本帖最后由 安靖 于 2014-11-19 15:44 编辑

想要fortran和C++/C混合编程,C++/C编译成静态库,然后fortran调用。用一个简单的例子来说明

c++文件
sum.cpp
[] 纯文本查看 复制代码
int sum_fun(int &n, double num[], double &sum)
{
       int i;
       sum = 0.0;
       for(i = 0; i < n; i++)
       {
               sum += num;
        }
        return 0;
}

fortran文件
main.f90
[Fortran] 纯文本查看 复制代码
program main
     implicit none
     integer :: n
     real :: a
     real, allocatable, dimension(:) :: num
     n = 4
     allocate( num(n) )
    num = 1.0;
    call sum_fun(n, num, a)
     write(*,*) "The sum is ', a
end program


cpp生成静态库
g++ -c sum.cpp
ar -cr libsum.a sum.o
生成可执行程序
ifort -c main.f90
ifort -o main.o -L./ -lsum -lstdc++


大致的思路如上,但是存在问题。请大家帮我看看哪里不对


作者: Villain    时间: 2014-11-19 16:27
混编完全不会,但是看了代码觉得楼主有个很明显的问题,C++的数组是从0开始,而fortran的数组是从1开始,貌似不能像楼主那么玩吧?还有,fortran在传递动态数组的时候貌似需要interface的吧。
菜鸟意见,坐等大神回答。
作者: 安靖    时间: 2014-11-19 16:31
本帖最后由 安靖 于 2014-11-19 16:54 编辑

自己搞定了,改成这样就行了。。

c++文件
sum.cpp
[] 纯文本查看 复制代码
#indef __cplusplus
      extern "C"{
      int sum_fun_(int &, double *, double &);
}#endif

int sum_fun_(int &n, double num[], double &sum)
{
       int i;
       sum = 0.0;
       for(i = 0; i < n; i++)
       {
               sum += num;
        }
        return 0;
}

fortran文件
main.f90
[Fortran] 纯文本查看 复制代码
program main
     implicit none
     integer :: n
     real :: a
     real, allocatable, dimension(:) :: num
     n = 4
     allocate( num(n) )
    num = 1.0;
    call sum_fun(n, num, a)
     write(*,*) "The sum is ', a
end program


cpp生成静态库
g++ -c sum.cpp
ar -cr libsum.a sum.o
生成可执行程序
ifort -c -r8 -main.f90
ifort -o test main.o -L./ -lsum -lstdc++




作者: 楚香饭    时间: 2014-11-19 19:30
这是没加类,加上类的话,Fortran 调用 C++ 就很难搞了。反之 C++ 调用 Fortran 就容易多了。
作者: 安靖    时间: 2014-11-19 22:26
楚香饭 发表于 2014-11-19 19:30
这是没加类,加上类的话,Fortran 调用 C++ 就很难搞了。反之 C++ 调用 Fortran 就容易多了。 ...

是的,暂时先不加类试下。
下一步就是想试着加类混编下。

用c写个接口,封装下c++,把面向对象又变成面向过程。
你有没有搞过类似的工作的。 Fortran调用C++类?


作者: 安靖    时间: 2014-11-19 22:26
楚香饭 发表于 2014-11-19 19:30
这是没加类,加上类的话,Fortran 调用 C++ 就很难搞了。反之 C++ 调用 Fortran 就容易多了。 ...

是的,暂时先不加类试下。
下一步就是想试着加类混编下。

用c写个接口,封装下c++,把面向对象又变成面向过程。
你有没有搞过类似的工作的。 Fortran调用C++类?
作者: 楚香饭    时间: 2014-11-20 07:29
我只搞过 Fortran 调用 C。
C/C++ 部分是其他同事搞的,也只能是写成 C 的接口。
作者: addison    时间: 2014-11-20 11:53
混合编程的话,最好是fortran调用c,如果是比较大型工程,fortran要加interface和iso-c-banding等来完成interface,目前用fortran90调用c的lib或dll,都比以前容易太多了。主要可以不考虑调用约定等问题了。可以参考netcdf的架构体系。
作者: pasuka    时间: 2014-11-20 13:33
安靖 发表于 2014-11-19 22:26
是的,暂时先不加类试下。
下一步就是想试着加类混编下。

这样做岂不是以卵击石吗?
C++的好处是:面向对象、使用者多、参考资料多
Fortran的唯一好处是:简单易学,有大量历史遗留代码
用C封装C++的类,然后再让Fortran去调用,事倍功半
很多商业软件的做法只有2种:
1、用C、C++重写fortran部分代码;
2、封装fortran供C、C++调用
作者: 安靖    时间: 2014-11-22 10:21
addison 发表于 2014-11-20 11:53
混合编程的话,最好是fortran调用c,如果是比较大型工程,fortran要加interface和iso-c-banding等来完成int ...

netcdf架构? Network Common Data Form这个?
作者: 安靖    时间: 2014-11-22 10:25
pasuka 发表于 2014-11-20 13:33
这样做岂不是以卵击石吗?
C++的好处是:面向对象、使用者多、参考资料多
Fortran的唯一好处是:简单易学 ...

恩,你说的很有道理。
但是大部分代码是fortran的,而其中添加的功能是用c++的。 重写花的代价比较大,近期应该不会去做。
你的建议我会记下的




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2