Fortran Coder

查看: 92|回复: 5

[混编] C++与Fortran混编问题

[复制链接]

4

帖子

1

主题

0

精华

新人

F 币
29 元
贡献
13 点
发表于 2019-5-9 11:50:11 | 显示全部楼层 |阅读模式
学习C++与Fortran混编遇到的问题。
Fortran子程序已经编译为obj文件。放在C++项目的debug文件夹。调用时提示如下错误:

[Fortran] 纯文本查看 复制代码
subroutine  sub_mixedCpp(a, b, c)  bind(C, name = 'sub_mixedCpp')

	use iso_c_binding
    implicit none
        
    real(c_float)  :: a, b, c
	
	c = a * b
end subroutine  sub_mixedCpp 



000.PNG











回复

使用道具 举报

2

帖子

0

主题

0

精华

入门

F 币
46 元
贡献
23 点
发表于 2019-5-9 12:29:20 | 显示全部楼层
本帖最后由 penultimate 于 2019-5-9 12:33 编辑

1. 在VS 中,Bind好像不管用,要用如下的格式导出FORTRAN的DLL:
!DEC$ ATTRIBUTES DLLEXPORT,STDCALL,DECORATE,ALIAS:'C++中调用时的名称,大小写敏感' :: FORTRAN中的名称
2. 在C++中,要声明下:
void(或FORTRAN中的FUNCTION的返回值类型)__stdcall FORTRAN的ALIAS属性中定义的名称 (float& a, float& b, float& c);

没有卑微的coding,就没有宏大的CAE

2

帖子

0

主题

0

精华

入门

F 币
46 元
贡献
23 点
发表于 2019-5-9 12:38:31 | 显示全部楼层
本帖最后由 penultimate 于 2019-5-9 12:49 编辑

1. 在FORTRAN中加:
!DEC$ ATTRIBUTES DLLEXPORT,STDCALL,DECORATE,ALIAS:'sub_mixedCpp' :: sub_mixedCpp
把Bind去掉
2. 在C++中声明:
void __stdcall sub_mixedCpp (float& a, float& b, float& c);
3.链接属性里把lib加进去,确保exe能够找到FORTRAN的dll
做到以上3点,应该就可以了
没有卑微的coding,就没有宏大的CAE

653

帖子

0

主题

0

精华

大师

F 币
509 元
贡献
280 点

规矩勋章元老勋章新人勋章水王勋章

QQ
发表于 2019-5-9 15:09:07 | 显示全部楼层
obj文件好像VS不认的。需要编译成 lib 文件。
不能简单的放入debug 文件夹,需要放入工程里。

4

帖子

1

主题

0

精华

新人

F 币
29 元
贡献
13 点
 楼主| 发表于 2019-5-9 21:11:53 | 显示全部楼层
vvt 发表于 2019-5-9 15:09
obj文件好像VS不认的。需要编译成 lib 文件。
不能简单的放入debug 文件夹,需要放入工程里。
...

那需要添加依赖项吗

653

帖子

0

主题

0

精华

大师

F 币
509 元
贡献
280 点

规矩勋章元老勋章新人勋章水王勋章

QQ
发表于 2019-5-10 08:47:57 | 显示全部楼层
鹰击长空 发表于 2019-5-9 21:11
那需要添加依赖项吗

不需要,就像这样:(红色箭头是添加的lib文件,紫色是fortran工程)
Ar.png
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2019-5-25 16:01

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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