Fortran Coder

查看: 19396|回复: 17
打印 上一主题 下一主题

[混编] Fortran和C/C++混编

[复制链接]

30

帖子

8

主题

0

精华

熟手

F 币
212 元
贡献
104 点
跳转到指定楼层
楼主
发表于 2016-1-12 23:09:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
从来没有做过混编,求助如何进行Fortran和C/C++的混编!

具体情况是这样的:

目前我们有个规模比较大的程序,是用fortran 90/95写的,大概有三四百个子程序。由于工作要求以及后续的平台规划,需要逐步将原先的fortran代码转化为c/c++代码。考虑到原始程序规模比较大,一次性改写所有子程序不太现实,目前打算逐个子程序进行修改测试。这样的话就涉及到混编的问题。

我们使用的是VS2010+IVF2011,不知道具体该怎么做?比如:整个改写过程是用c调用fortran还是fortran调用c?具体怎么调用?需要建立两个项目(分别是c和fortran)还是将所有代码建立在一个项目中?编译器、链接器如何设置?还有就是我想到个感觉比较麻烦的事情就是原来fortran代码里面的common变量不知道如何处理?

最后就是转化成c还是c++?原来的程序中没有面向对象的东西,那转化成c还是c++好一些?目前这个计算程序的界面倒是QT C++写的,不知道是否有影响或者有关系?

还请指导!先谢过!
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩
世界上有 10 种人:懂 10 进制的人,和不懂 10 进制的人。

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

沙发
发表于 2016-1-13 08:20:14 | 只看该作者
1、成熟代码的话,不用重写,直接加个interface按照iso c binding的要求,给出C的接口,方便C或C++调用
2、混合编译的话,为啥不用cmake呢?

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

板凳
发表于 2016-1-13 09:01:05 | 只看该作者
你问的问题每一个都不是三言两语可以说清楚的。

ISO_C_Binding 是好的选择。详情可以看《Modern Fortran Explained》第12章。本论坛本版块有混编分类,也可以看看以前的帖子。

30

帖子

8

主题

0

精华

熟手

F 币
212 元
贡献
104 点
地板
 楼主| 发表于 2016-1-13 09:08:41 | 只看该作者
本帖最后由 sharpcoder 于 2016-1-13 09:10 编辑
pasuka 发表于 2016-1-13 08:20
1、成熟代码的话,不用重写,直接加个interface按照iso c binding的要求,给出C的接口,方便C或C++调用
2、 ...
非常感谢您!

1. 因为最终是要做成商业计算软件发布,我们的只是其中一小部分,牵扯到发布要求以及平台的统一规定等等,改写c也是无奈之举,之前我们都是把fortran打包成dll或者so文件直接调用。唉!

2. cmake的话没有接触过,之前看到国外好多搞数值计算的都在用,您也提到了,我打算也学习一下。
世界上有 10 种人:懂 10 进制的人,和不懂 10 进制的人。

30

帖子

8

主题

0

精华

熟手

F 币
212 元
贡献
104 点
5#
 楼主| 发表于 2016-1-13 09:10:45 | 只看该作者
fcode 发表于 2016-1-13 09:01
你问的问题每一个都不是三言两语可以说清楚的。

ISO_C_Binding 是好的选择。详情可以看《Modern Fortran E ...

好的,我先去看看。非常感谢您~

主要还是完全没有思路,感觉无从下手~我先找找有没有类似的例子,这样可能上手会比较快一些~
世界上有 10 种人:懂 10 进制的人,和不懂 10 进制的人。

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

6#
发表于 2016-1-13 10:31:24 | 只看该作者
sharpcoder 发表于 2016-1-13 09:08
非常感谢您!

1. 因为最终是要做成商业计算软件发布,我们的只是其中一小部分,牵扯到发布要求以及平台的 ...

若是fortran代码技术状态冻结,那么iso c bing写interface,本质上与打包动态链接库一个路数
反之,甭纠结,勿留恋,C++推倒重来
btw,为啥fortran代码打包动态链接库的办法被否决呢?好多商业软件照样用得很欢快

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

7#
发表于 2016-1-13 10:33:50 | 只看该作者
sharpcoder 发表于 2016-1-13 09:10
好的,我先去看看。非常感谢您~

主要还是完全没有思路,感觉无从下手~我先找找有没有类似的例子,这样可 ...

“之前我们都是把fortran打包成dll或者so文件直接调用”
  -------------都是一个路数,iso c binding就是把各家fortran编译器混合编程标准给规范统一了

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

8#
发表于 2016-1-13 11:03:28 | 只看该作者
打包成 dll 或 so 就可以了,我们也是做商业化程序,经常会使用到混编,打包成 dll 是很常见的路数。
包括成熟的软件,matlab 自身,也使用了多种语言(据说有13种之多)。我们行业用到的很多专业软件,也都是多种语言书写完成的。
有一些情况不适合打包成 dll,例如害怕别人猜测 dll 接口而非法调用。此时可以使用 lib 或 obj 混编。

不管什么方式,都可以,也都应该使用 ISO_C_Binding 来规范化接口。

30

帖子

8

主题

0

精华

熟手

F 币
212 元
贡献
104 点
9#
 楼主| 发表于 2016-1-13 15:50:20 | 只看该作者
pasuka 发表于 2016-1-13 10:31
若是fortran代码技术状态冻结,那么iso c bing写interface,本质上与打包动态链接库一个路数
反之,甭纠 ...

理论上是想完全推倒重来,但是考虑到代码量太大了,所以打算一个一个子程序的改,改完一个测试一个,以免最终结果出入太大。完全重来的话后续的测试也是个麻烦事~

btw,我们的代码里面有很多以前别人写的fortran库和代码,对编译器(intel,compaq,gfortran等)依赖性太高了,而且不是很稳定,所以就考虑重新安装c/c++来设计了,感觉上层的意思是想从语言开始另起炉灶了
世界上有 10 种人:懂 10 进制的人,和不懂 10 进制的人。

30

帖子

8

主题

0

精华

熟手

F 币
212 元
贡献
104 点
10#
 楼主| 发表于 2016-1-13 15:53:00 | 只看该作者
fcode 发表于 2016-1-13 11:03
打包成 dll 或 so 就可以了,我们也是做商业化程序,经常会使用到混编,打包成 dll 是很常见的路数。
包括 ...

还有个问题就是后续可能需要修改一些数学模型,不转c的话后续还得用到fortran,如果单独打包部分子程序为dll的话common变量又是个问题,原来的程序比较老,几乎每个子程序都用到了common,也很愁~
世界上有 10 种人:懂 10 进制的人,和不懂 10 进制的人。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-23 18:49

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表