大橙子cqx 发表于 2020-7-2 15:01 你不能保证所有的编译器都是 __mod名_MOD_mpp_start 这种命名规则。而且这样也很麻烦。 只要你写了 Bind(C,Name="mpp_start") 就不会存在这个问题。 |
您好,我刚刚解决了这个问题,具体的做法写到上面的回复中了。感谢您的解答! |
大橙子cqx 发表于 2020-7-2 15:01 上代码 |
大橙子cqx 发表于 2020-7-2 13:40 Optional 是函数高级用法,不能在混编中使用。 你可以用低级用法套一层函数,调用高级用法。 就好像 [Fortran] 纯文本查看 复制代码 Subroutine c_mpp_start( localComm ) Bind(C,Name="mpp_start") Integer , value :: localComm call mpp_start(localComm) End Subroutine c_mpp_start Subroutine mpp_start( localComm ) Integer , optional , intent(IN) :: localComm End Subroutine mpp_start |
本帖最后由 大橙子cqx 于 2020-7-2 17:59 编辑 fcode 发表于 2020-7-2 11:14 您好,我自己创建了一个简单的Fortran文件测试,当该文件只有一个subroutine的时候是可以链接的 但是如果给它套一个module的壳就会出现未定义的引用。想知道造成这样问题的原因可能是什么呢?感谢您的解答 我刚刚解决了这个问题,在头文件中声明时,我之前时直接写的函数的名字mpp_start。有module的情况下应写为:__mod名_MOD_mpp_start.希望可以给遇到相同问题的人一些帮助。。 |
fcode 发表于 2020-7-2 11:14 localComm应该是必须有OPTIONAL的 因为下面有PRESENT(localComm) 但是OPTIONAL和value好像不能共存。。不加value只加Bind还是会有未定义的错误。。 |
[Fortran] 纯文本查看 复制代码 Subroutine mpp_start( localComm ) Bind(C,Name="mpp_start") Integer , value :: localComm !... End Subroutine mpp_start |
没有任何其它设置就直接调用?我不会混合编程,但是我记得Fortran和C++编译后的函数名称有区别,Fortran程序里应该为C++调用加一些编译声明。 |
捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )
GMT+8, 2024-11-23 10:51